diff --git a/.gitignore b/.gitignore index d5263fe..3f1c2e3 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ /.bundle/ /coverage/ /pkg/ +/.openapi-generator.* +/.generation-check.* *.gem *.log - diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..be2b5d0 --- /dev/null +++ b/Gemfile @@ -0,0 +1,6 @@ +source "https://rubygems.org" + +gemspec + +gem "minitest" +gem "rake" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..f0b95b5 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,44 @@ +PATH + remote: . + specs: + replynodes (0.1.0) + faraday (>= 2.0, < 3.0) + faraday-multipart (>= 1.0) + marcel (>= 1.0) + +GEM + remote: https://rubygems.org/ + specs: + drb (2.2.3) + faraday (2.14.4) + faraday-net_http (>= 2.0, < 3.5) + json + logger + faraday-multipart (1.2.0) + multipart-post (~> 2.0) + faraday-net_http (3.4.4) + net-http (~> 0.5) + json (3.0.2) + logger (1.7.0) + marcel (2.1.0) + minitest (6.0.6) + drb (~> 2.0) + prism (~> 1.5) + multipart-post (2.4.1) + net-http (0.9.1) + uri (>= 0.11.1) + prism (1.9.0) + rake (13.4.2) + uri (1.1.1) + +PLATFORMS + ruby + x86_64-linux + +DEPENDENCIES + minitest + rake + replynodes! + +BUNDLED WITH + 2.5.22 diff --git a/README.md b/README.md index b0c0b67..21cfbc8 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,14 @@ -# ReplyNodes Ruby SDK +# ReplyNodes Ruby SDK (legacy) -Ruby client for the authenticated, read-only ReplyNodes API. +This repository contains a generated REST SDK whose public contract is pending audit. It is retained for historical reference only and is not a current installation or endpoint guide. -This repository is the source for the `replynodes` gem. The generated HTTP -client is isolated under `lib/replynodes/generated/`; the public `ReplyNodes::Client` -API is maintained separately so generated files can be regenerated safely. +Do not use the retired REST default from older examples. The canonical current agent-facing surface is the ReplyNodes MCP: -Implementation is being developed from the canonical ReplyNodes Fetcher -OpenAPI contract. +- Repository: https://github.com/replynodes/replynodes-mcp +- Endpoint: `https://mcp.replynodes.com/mcp` +The MCP is not a drop-in REST replacement for this generated Ruby client. Contract and release decisions for the SDK are tracked separately; this documentation intentionally does not provide a replacement REST base URL. + +## Development + +Generated sources remain under `lib/replynodes/generated/` and are produced from the vendored OpenAPI contract. Do not treat the generated surface as current production guidance until the SDK contract audit is complete. diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..ba6cc25 --- /dev/null +++ b/Rakefile @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +require "rake/testtask" + +Rake::TestTask.new do |task| + task.libs << "lib" + task.libs << "test" + task.pattern = "test/**/*_test.rb" +end + +task default: :test diff --git a/config/.openapi-generator-ignore b/config/.openapi-generator-ignore new file mode 100644 index 0000000..f399214 --- /dev/null +++ b/config/.openapi-generator-ignore @@ -0,0 +1,8 @@ +# The public gem owns its gemspec, README, and tests outside the generated tree. +* +!lib/ +!lib/** +!lib/replynodes/ +!lib/replynodes/** +!lib/replynodes/generated/ +!lib/replynodes/generated/** diff --git a/config/openapi-generator.json b/config/openapi-generator.json new file mode 100644 index 0000000..654b980 --- /dev/null +++ b/config/openapi-generator.json @@ -0,0 +1,23 @@ +{ + "allowUnicodeIdentifiers": false, + "disallowAdditionalPropertiesIfNotPresent": false, + "ensureUniqueParams": true, + "enumUnknownDefaultCase": false, + "gemAuthor": "ReplyNodes", + "gemAuthorEmail": "support@replynodes.com", + "gemDescription": "Ruby client for the ReplyNodes read-only data API", + "gemHomepage": "https://replynodes.com", + "gemLicense": "MIT", + "gemName": "replynodes", + "gemRequiredRubyVersion": ">= 3.0", + "gemSummary": "ReplyNodes Ruby SDK", + "gemVersion": "0.1.0", + "hideGenerationTimestamp": true, + "legacyDiscriminatorBehavior": true, + "library": "faraday", + "moduleName": "ReplyNodesGenerated", + "prependFormOrBodyParameters": false, + "sortModelPropertiesByRequiredFlag": true, + "sortParamsByRequiredFlag": true, + "useAutoload": false +} diff --git a/lib/replynodes.rb b/lib/replynodes.rb new file mode 100644 index 0000000..a2476b7 --- /dev/null +++ b/lib/replynodes.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +require "set" + +generated_path = File.expand_path("replynodes/generated", __dir__) +$LOAD_PATH.unshift(generated_path) unless $LOAD_PATH.include?(generated_path) + +# Bundler evaluates the gemspec before loading the library, which loads the +# public version file under the same require feature as the generated version. +# Load the generated namespace's version by path so ApiClient always sees it. +require_relative "replynodes/generated/replynodes/version" +require "replynodes/generated" +require_relative "replynodes/version" +require_relative "replynodes/operation_registry" +require_relative "replynodes/error" +require_relative "replynodes/response" +require_relative "replynodes/client" diff --git a/lib/replynodes/client.rb b/lib/replynodes/client.rb new file mode 100644 index 0000000..57c8027 --- /dev/null +++ b/lib/replynodes/client.rb @@ -0,0 +1,130 @@ +# frozen_string_literal: true + +require "uri" + +module ReplyNodes + class Client + DEFAULT_BASE_URL = "https://api.replynodes.com" + DEFAULT_TIMEOUT = 60 + + attr_reader :base_url, :timeout + + def initialize(api_key:, base_url: DEFAULT_BASE_URL, timeout: DEFAULT_TIMEOUT, user_agent: nil) + raise ArgumentError, "api_key is required" if api_key.nil? || api_key.to_s.empty? + + @base_url = normalize_base_url(base_url) + @timeout = Float(timeout) + raise ArgumentError, "timeout must be greater than zero" unless @timeout.positive? + + configuration = ReplyNodesGenerated::Configuration.new + configure_base_url(configuration, @base_url) + configuration.access_token = api_key.to_s + configuration.timeout = @timeout + # The generated Faraday client has no retry middleware. Keep this + # explicit: every SDK operation performs exactly one HTTP GET attempt. + configuration.configure_faraday_connection { |_connection| } + + @api_client = ReplyNodesGenerated::ApiClient.new(configuration) + @api_client.user_agent = user_agent if user_agent + @apis = {} + end + + def call(operation, *positional, **keyword) + name = operation.to_sym + specification = OPERATIONS.fetch(name) do + raise ArgumentError, "unknown ReplyNodes operation: #{operation}" + end + params = normalize_params(positional, keyword) + required_values, optional_values = split_params(specification, params, positional) + api = api_for(specification[:api_class]) + method = "#{specification[:generated_method]}_with_http_info" + generated, status, headers = api.public_send(method, *required_values, optional_values) + Response.new(generated, status, headers) + rescue ReplyNodesGenerated::ApiError => e + raise Error.from_exception(e), cause: e + end + + OPERATIONS.each_key do |operation| + define_method(operation) do |*positional, **keyword| + call(operation, *positional, **keyword) + end + end + + private + + def normalize_base_url(value) + uri = URI.parse(value.to_s) + unless %w[http https].include?(uri.scheme) && uri.host + raise ArgumentError, "base_url must be an absolute HTTP(S) URL" + end + if uri.userinfo || uri.query || uri.fragment + raise ArgumentError, "base_url must not contain credentials, query, or fragment" + end + + uri.to_s.sub(%r{/\z}, "") + rescue URI::InvalidURIError + raise ArgumentError, "base_url must be an absolute HTTP(S) URL" + end + + def configure_base_url(configuration, value) + uri = URI.parse(value) + configuration.ignore_operation_servers = true + configuration.scheme = uri.scheme + host = uri.host + default_port = uri.scheme == "https" ? 443 : 80 + host = "#{host}:#{uri.port}" if uri.port && uri.port != default_port + configuration.host = host + configuration.base_path = uri.path + end + + def normalize_params(positional, keyword) + if positional.last.is_a?(Hash) && keyword.empty? + positional.pop.merge + else + keyword + end + end + + def split_params(specification, params, positional) + params = params.transform_keys(&:to_sym) + required = specification[:parameters].select { |parameter| parameter[:required] } + optional = specification[:parameters] - required + if positional.length > required.length + raise ArgumentError, "too many positional arguments for #{specification[:operation_id]}" + end + + required_values = required.each_with_index.map do |parameter, index| + if index < positional.length + positional[index] + else + value, = take_param(params, parameter, required: true) + value + end + end + + optional_values = {} + optional.each do |parameter| + value, present = take_param(params, parameter, required: false) + optional_values[parameter[:name]] = value if present + end + + unknown = params.keys - specification[:parameters].flat_map { |parameter| [parameter[:name], parameter[:wire_name].to_sym] } + raise ArgumentError, "unknown parameter(s) for #{specification[:operation_id]}: #{unknown.join(", ")}" unless unknown.empty? + + [required_values, optional_values] + end + + def take_param(params, parameter, required:) + keys = [parameter[:name], parameter[:wire_name].to_sym] + key = keys.find { |candidate| params.key?(candidate) } + return [params.delete(key), true] if key + return [nil, false] unless required + + raise ArgumentError, "missing required parameter: #{parameter[:name]}" + end + + def api_for(class_name) + @apis[class_name] ||= ReplyNodesGenerated.const_get(class_name).new(@api_client) + end + end +end diff --git a/lib/replynodes/error.rb b/lib/replynodes/error.rb new file mode 100644 index 0000000..1ab04e8 --- /dev/null +++ b/lib/replynodes/error.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true + +require "json" + +module ReplyNodes + class Error < StandardError + attr_reader :status, :code, :request_id, :response_headers, :response_body, :cause + + def initialize(status:, code:, message:, request_id: nil, response_headers: {}, response_body: nil, cause: nil) + @status = status + @code = code + @request_id = request_id + @response_headers = response_headers || {} + @response_body = response_body + @cause = cause + @detail_message = message + super(message) + end + + def message + "ReplyNodes request failed (status=#{status || "n/a"}, code=#{code || "n/a"}, " \ + "message=#{@detail_message}, request_id=#{request_id || "n/a"})" + end + + def to_s + message + end + + def self.from_exception(exception) + body = exception.respond_to?(:response_body) ? exception.response_body : nil + headers = exception.respond_to?(:response_headers) ? exception.response_headers : {} + status = exception.respond_to?(:code) && exception.code.to_i.positive? ? exception.code.to_i : nil + payload = parse_body(body) + detail = payload.is_a?(Hash) ? (payload["error"] || payload[:error] || {}) : {} + detail = {} unless detail.is_a?(Hash) + request_id = detail["request_id"] || detail[:request_id] || header_value(headers, "x-request-id") + code = detail["code"] || detail[:code] || (status ? "http_#{status}" : "network_error") + message = detail["message"] || detail[:message] || exception.message.to_s + + if exception.is_a?(ReplyNodesGenerated::ApiError) && exception.message.to_s.match?(/timed out/i) + code = "timeout" + message = "Request timed out" + end + + new( + status: status, + code: code, + message: message, + request_id: request_id, + response_headers: headers, + response_body: body, + cause: exception + ) + end + + def self.parse_body(body) + return {} unless body.is_a?(String) && !body.empty? + + JSON.parse(body) + rescue JSON::ParserError + {} + end + private_class_method :parse_body + + def self.header_value(headers, wanted) + headers.to_h.each do |key, value| + return value if key.to_s.downcase == wanted + end + nil + end + private_class_method :header_value + end +end diff --git a/lib/replynodes/generated.rb b/lib/replynodes/generated.rb new file mode 100644 index 0000000..03b4e80 --- /dev/null +++ b/lib/replynodes/generated.rb @@ -0,0 +1,69 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +# Common files +require 'replynodes/api_client' +require 'replynodes/api_error' +require 'replynodes/version' +require 'replynodes/configuration' + +# Models +require 'replynodes/models/brand_fonts_data' +require 'replynodes/models/brand_fonts_response' +require 'replynodes/models/credit_topup_required' +require 'replynodes/models/error_detail' +require 'replynodes/models/error_response' +require 'replynodes/models/pagination' +require 'replynodes/models/payment_required' +require 'replynodes/models/payment_required_accountless_extensions' +require 'replynodes/models/payment_required_accountless_extensions_x_replynodes_accountless' +require 'replynodes/models/payment_required_extensions' +require 'replynodes/models/payment_required_prepaid_extensions' +require 'replynodes/models/payment_required_prepaid_extensions_topup' +require 'replynodes/models/payment_required_resource' +require 'replynodes/models/payment_required_response' +require 'replynodes/models/payment_requirements' +require 'replynodes/models/response_meta' +require 'replynodes/models/success_response' + +# APIs +require 'replynodes/api/app_store_api' +require 'replynodes/api/brand_api' +require 'replynodes/api/fomo_api' +require 'replynodes/api/google_api' +require 'replynodes/api/google_maps_api' +require 'replynodes/api/google_play_api' +require 'replynodes/api/google_shopping_api' +require 'replynodes/api/hacker_news_api' +require 'replynodes/api/instagram_api' +require 'replynodes/api/reddit_api' +require 'replynodes/api/tiktok_api' +require 'replynodes/api/web_api' +require 'replynodes/api/youtube_api' + +module ReplyNodesGenerated + class << self + # Customize default settings for the SDK using block. + # ReplyNodesGenerated.configure do |config| + # config.username = "xxx" + # config.password = "xxx" + # end + # If no block given, return the default Configuration object. + def configure + if block_given? + yield(Configuration.default) + else + Configuration.default + end + end + end +end diff --git a/lib/replynodes/generated/replynodes/api/app_store_api.rb b/lib/replynodes/generated/replynodes/api/app_store_api.rb new file mode 100644 index 0000000..d801ace --- /dev/null +++ b/lib/replynodes/generated/replynodes/api/app_store_api.rb @@ -0,0 +1,679 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'cgi' + +module ReplyNodesGenerated + class AppStoreApi + attr_accessor :api_client + + def initialize(api_client = ApiClient.default) + @api_client = api_client + end + # Look up one public App Store application + # Look up one public App Store application. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [String] :id Numeric track id; provide this or appId. + # @option opts [String] :app_id Bundle id; provide this or id. + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :lang Language code. + # @option opts [Boolean] :ratings Include ratings information. + # @return [SuccessResponse] + def app_store_app(opts = {}) + data, _status_code, _headers = app_store_app_with_http_info(opts) + data + end + + # Look up one public App Store application + # Look up one public App Store application. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [String] :id Numeric track id; provide this or appId. + # @option opts [String] :app_id Bundle id; provide this or id. + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :lang Language code. + # @option opts [Boolean] :ratings Include ratings information. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def app_store_app_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: AppStoreApi.app_store_app ...' + end + # resource path + local_var_path = '/v1/appstore/app' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'id'] = opts[:'id'] if !opts[:'id'].nil? + query_params[:'appId'] = opts[:'app_id'] if !opts[:'app_id'].nil? + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'lang'] = opts[:'lang'] if !opts[:'lang'].nil? + query_params[:'ratings'] = opts[:'ratings'] if !opts[:'ratings'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"AppStoreApi.app_store_app", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: AppStoreApi#app_store_app\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # List applications by developer + # List applications by developer. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param dev_id [String] public developer identifier. + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :lang Language code. + # @return [SuccessResponse] + def app_store_developer(dev_id, opts = {}) + data, _status_code, _headers = app_store_developer_with_http_info(dev_id, opts) + data + end + + # List applications by developer + # List applications by developer. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param dev_id [String] public developer identifier. + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :lang Language code. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def app_store_developer_with_http_info(dev_id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: AppStoreApi.app_store_developer ...' + end + # verify the required parameter 'dev_id' is set + if @api_client.config.client_side_validation && dev_id.nil? + fail ArgumentError, "Missing the required parameter 'dev_id' when calling AppStoreApi.app_store_developer" + end + # resource path + local_var_path = '/v1/appstore/developer' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'devId'] = dev_id + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'lang'] = opts[:'lang'] if !opts[:'lang'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"AppStoreApi.app_store_developer", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: AppStoreApi#app_store_developer\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # List applications from an iTunes collection + # List applications from an iTunes collection. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [String] :collection Provider collection constant. + # @option opts [String] :category Provider category constant. + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :lang Language code. + # @option opts [Integer] :num Number of applications; values outside 1..200 are rejected. + # @option opts [Boolean] :full_detail Request detail enrichment. + # @return [SuccessResponse] + def app_store_list(opts = {}) + data, _status_code, _headers = app_store_list_with_http_info(opts) + data + end + + # List applications from an iTunes collection + # List applications from an iTunes collection. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [String] :collection Provider collection constant. + # @option opts [String] :category Provider category constant. + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :lang Language code. + # @option opts [Integer] :num Number of applications; values outside 1..200 are rejected. + # @option opts [Boolean] :full_detail Request detail enrichment. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def app_store_list_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: AppStoreApi.app_store_list ...' + end + if @api_client.config.client_side_validation && !opts[:'num'].nil? && opts[:'num'] > 200 + fail ArgumentError, 'invalid value for "opts[:"num"]" when calling AppStoreApi.app_store_list, must be smaller than or equal to 200.' + end + + if @api_client.config.client_side_validation && !opts[:'num'].nil? && opts[:'num'] < 1 + fail ArgumentError, 'invalid value for "opts[:"num"]" when calling AppStoreApi.app_store_list, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/appstore/list' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'collection'] = opts[:'collection'] if !opts[:'collection'].nil? + query_params[:'category'] = opts[:'category'] if !opts[:'category'].nil? + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'lang'] = opts[:'lang'] if !opts[:'lang'].nil? + query_params[:'num'] = opts[:'num'] if !opts[:'num'].nil? + query_params[:'fullDetail'] = opts[:'full_detail'] if !opts[:'full_detail'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"AppStoreApi.app_store_list", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: AppStoreApi#app_store_list\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Read public App Store privacy details + # Read public App Store privacy details. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] public application identifier. + # @param [Hash] opts the optional parameters + # @return [SuccessResponse] + def app_store_privacy(id, opts = {}) + data, _status_code, _headers = app_store_privacy_with_http_info(id, opts) + data + end + + # Read public App Store privacy details + # Read public App Store privacy details. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] public application identifier. + # @param [Hash] opts the optional parameters + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def app_store_privacy_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: AppStoreApi.app_store_privacy ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling AppStoreApi.app_store_privacy" + end + # resource path + local_var_path = '/v1/appstore/privacy' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'id'] = id + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"AppStoreApi.app_store_privacy", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: AppStoreApi#app_store_privacy\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Read public app ratings + # Read public app ratings. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [String] :id public application identifier; provide this or appId. + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :app_id Bundle id; provide this or id. + # @return [SuccessResponse] + def app_store_ratings(opts = {}) + data, _status_code, _headers = app_store_ratings_with_http_info(opts) + data + end + + # Read public app ratings + # Read public app ratings. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [String] :id public application identifier; provide this or appId. + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :app_id Bundle id; provide this or id. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def app_store_ratings_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: AppStoreApi.app_store_ratings ...' + end + # resource path + local_var_path = '/v1/appstore/ratings' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'id'] = opts[:'id'] if !opts[:'id'].nil? + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'appId'] = opts[:'app_id'] if !opts[:'app_id'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"AppStoreApi.app_store_ratings", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: AppStoreApi#app_store_ratings\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Read a page of public app reviews + # Read a page of public app reviews. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [String] :id public application identifier; provide this or appId. + # @option opts [String] :app_id Bundle id; provide this or id. + # @option opts [String] :country Two-letter storefront code. + # @option opts [Integer] :page Review page; values outside 1..10 are rejected. + # @option opts [String] :sort Provider review sort constant. + # @return [SuccessResponse] + def app_store_reviews(opts = {}) + data, _status_code, _headers = app_store_reviews_with_http_info(opts) + data + end + + # Read a page of public app reviews + # Read a page of public app reviews. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [String] :id public application identifier; provide this or appId. + # @option opts [String] :app_id Bundle id; provide this or id. + # @option opts [String] :country Two-letter storefront code. + # @option opts [Integer] :page Review page; values outside 1..10 are rejected. + # @option opts [String] :sort Provider review sort constant. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def app_store_reviews_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: AppStoreApi.app_store_reviews ...' + end + if @api_client.config.client_side_validation && !opts[:'page'].nil? && opts[:'page'] > 10 + fail ArgumentError, 'invalid value for "opts[:"page"]" when calling AppStoreApi.app_store_reviews, must be smaller than or equal to 10.' + end + + if @api_client.config.client_side_validation && !opts[:'page'].nil? && opts[:'page'] < 1 + fail ArgumentError, 'invalid value for "opts[:"page"]" when calling AppStoreApi.app_store_reviews, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/appstore/reviews' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'id'] = opts[:'id'] if !opts[:'id'].nil? + query_params[:'appId'] = opts[:'app_id'] if !opts[:'app_id'].nil? + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'page'] = opts[:'page'] if !opts[:'page'].nil? + query_params[:'sort'] = opts[:'sort'] if !opts[:'sort'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"AppStoreApi.app_store_reviews", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: AppStoreApi#app_store_reviews\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Search public App Store applications by term + # Search public App Store applications by term. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param term [String] Search term. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :num Number of results; values outside 1..50 are rejected. + # @option opts [Integer] :page Result page. + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :lang Language code. + # @option opts [Boolean] :ids_only Return ids without detail lookups. + # @return [SuccessResponse] + def app_store_search(term, opts = {}) + data, _status_code, _headers = app_store_search_with_http_info(term, opts) + data + end + + # Search public App Store applications by term + # Search public App Store applications by term. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param term [String] Search term. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :num Number of results; values outside 1..50 are rejected. + # @option opts [Integer] :page Result page. + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :lang Language code. + # @option opts [Boolean] :ids_only Return ids without detail lookups. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def app_store_search_with_http_info(term, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: AppStoreApi.app_store_search ...' + end + # verify the required parameter 'term' is set + if @api_client.config.client_side_validation && term.nil? + fail ArgumentError, "Missing the required parameter 'term' when calling AppStoreApi.app_store_search" + end + if @api_client.config.client_side_validation && !opts[:'num'].nil? && opts[:'num'] > 50 + fail ArgumentError, 'invalid value for "opts[:"num"]" when calling AppStoreApi.app_store_search, must be smaller than or equal to 50.' + end + + if @api_client.config.client_side_validation && !opts[:'num'].nil? && opts[:'num'] < 1 + fail ArgumentError, 'invalid value for "opts[:"num"]" when calling AppStoreApi.app_store_search, must be greater than or equal to 1.' + end + + if @api_client.config.client_side_validation && !opts[:'page'].nil? && opts[:'page'] > 200 + fail ArgumentError, 'invalid value for "opts[:"page"]" when calling AppStoreApi.app_store_search, must be smaller than or equal to 200.' + end + + if @api_client.config.client_side_validation && !opts[:'page'].nil? && opts[:'page'] < 1 + fail ArgumentError, 'invalid value for "opts[:"page"]" when calling AppStoreApi.app_store_search, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/appstore/search' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'term'] = term + query_params[:'num'] = opts[:'num'] if !opts[:'num'].nil? + query_params[:'page'] = opts[:'page'] if !opts[:'page'].nil? + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'lang'] = opts[:'lang'] if !opts[:'lang'].nil? + query_params[:'idsOnly'] = opts[:'ids_only'] if !opts[:'ids_only'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"AppStoreApi.app_store_search", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: AppStoreApi#app_store_search\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # List apps related to an application + # List apps related to an application. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [String] :id public application identifier; provide this or appId. + # @option opts [String] :app_id Bundle id; provide this or id. + # @return [SuccessResponse] + def app_store_similar(opts = {}) + data, _status_code, _headers = app_store_similar_with_http_info(opts) + data + end + + # List apps related to an application + # List apps related to an application. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [String] :id public application identifier; provide this or appId. + # @option opts [String] :app_id Bundle id; provide this or id. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def app_store_similar_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: AppStoreApi.app_store_similar ...' + end + # resource path + local_var_path = '/v1/appstore/similar' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'id'] = opts[:'id'] if !opts[:'id'].nil? + query_params[:'appId'] = opts[:'app_id'] if !opts[:'app_id'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"AppStoreApi.app_store_similar", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: AppStoreApi#app_store_similar\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Suggest public App Store search terms + # Suggest public App Store search terms. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param term [String] Search term. + # @param [Hash] opts the optional parameters + # @return [SuccessResponse] + def app_store_suggest(term, opts = {}) + data, _status_code, _headers = app_store_suggest_with_http_info(term, opts) + data + end + + # Suggest public App Store search terms + # Suggest public App Store search terms. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param term [String] Search term. + # @param [Hash] opts the optional parameters + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def app_store_suggest_with_http_info(term, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: AppStoreApi.app_store_suggest ...' + end + # verify the required parameter 'term' is set + if @api_client.config.client_side_validation && term.nil? + fail ArgumentError, "Missing the required parameter 'term' when calling AppStoreApi.app_store_suggest" + end + # resource path + local_var_path = '/v1/appstore/suggest' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'term'] = term + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"AppStoreApi.app_store_suggest", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: AppStoreApi#app_store_suggest\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + end +end diff --git a/lib/replynodes/generated/replynodes/api/brand_api.rb b/lib/replynodes/generated/replynodes/api/brand_api.rb new file mode 100644 index 0000000..df2d819 --- /dev/null +++ b/lib/replynodes/generated/replynodes/api/brand_api.rb @@ -0,0 +1,270 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'cgi' + +module ReplyNodesGenerated + class BrandApi + attr_accessor :api_client + + def initialize(api_client = ApiClient.default) + @api_client = api_client + end + # @param [Hash] opts the optional parameters + # @option opts [String] :domain + # @option opts [String] :url + # @return [BrandFontsResponse] + def brand_fonts(opts = {}) + data, _status_code, _headers = brand_fonts_with_http_info(opts) + data + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :domain + # @option opts [String] :url + # @return [Array<(BrandFontsResponse, Integer, Hash)>] BrandFontsResponse data, response status code and response headers + def brand_fonts_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: BrandApi.brand_fonts ...' + end + # resource path + local_var_path = '/v1/brand/fonts' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'domain'] = opts[:'domain'] if !opts[:'domain'].nil? + query_params[:'url'] = opts[:'url'] if !opts[:'url'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'BrandFontsResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"BrandApi.brand_fonts", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: BrandApi#brand_fonts\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :domain + # @option opts [String] :url + # @return [SuccessResponse] + def brand_retrieve(opts = {}) + data, _status_code, _headers = brand_retrieve_with_http_info(opts) + data + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :domain + # @option opts [String] :url + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def brand_retrieve_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: BrandApi.brand_retrieve ...' + end + # resource path + local_var_path = '/v1/brand/retrieve' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'domain'] = opts[:'domain'] if !opts[:'domain'].nil? + query_params[:'url'] = opts[:'url'] if !opts[:'url'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"BrandApi.brand_retrieve", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: BrandApi#brand_retrieve\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param query [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @return [SuccessResponse] + def brand_search(query, opts = {}) + data, _status_code, _headers = brand_search_with_http_info(query, opts) + data + end + + # @param query [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def brand_search_with_http_info(query, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: BrandApi.brand_search ...' + end + # verify the required parameter 'query' is set + if @api_client.config.client_side_validation && query.nil? + fail ArgumentError, "Missing the required parameter 'query' when calling BrandApi.brand_search" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling BrandApi.brand_search, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling BrandApi.brand_search, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/brand/search' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'query'] = query + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"BrandApi.brand_search", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: BrandApi#brand_search\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :domain + # @option opts [String] :url + # @return [SuccessResponse] + def brand_styleguide(opts = {}) + data, _status_code, _headers = brand_styleguide_with_http_info(opts) + data + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :domain + # @option opts [String] :url + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def brand_styleguide_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: BrandApi.brand_styleguide ...' + end + # resource path + local_var_path = '/v1/brand/styleguide' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'domain'] = opts[:'domain'] if !opts[:'domain'].nil? + query_params[:'url'] = opts[:'url'] if !opts[:'url'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"BrandApi.brand_styleguide", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: BrandApi#brand_styleguide\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + end +end diff --git a/lib/replynodes/generated/replynodes/api/fomo_api.rb b/lib/replynodes/generated/replynodes/api/fomo_api.rb new file mode 100644 index 0000000..e59c8b3 --- /dev/null +++ b/lib/replynodes/generated/replynodes/api/fomo_api.rb @@ -0,0 +1,1128 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'cgi' + +module ReplyNodesGenerated + class FomoApi + attr_accessor :api_client + + def initialize(api_client = ApiClient.default) + @api_client = api_client + end + # @param [Hash] opts the optional parameters + # @option opts [String] :type + # @option opts [String] :chain + # @option opts [String] :since + # @option opts [Integer] :limit + # @return [SuccessResponse] + def fomo_alerts(opts = {}) + data, _status_code, _headers = fomo_alerts_with_http_info(opts) + data + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :type + # @option opts [String] :chain + # @option opts [String] :since + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_alerts_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_alerts ...' + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_alerts, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_alerts, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/fomo/alerts' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'type'] = opts[:'type'] if !opts[:'type'].nil? + query_params[:'chain'] = opts[:'chain'] if !opts[:'chain'].nil? + query_params[:'since'] = opts[:'since'] if !opts[:'since'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_alerts", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_alerts\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param window [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :chain + # @option opts [Integer] :limit + # @return [SuccessResponse] + def fomo_leaderboard(window, opts = {}) + data, _status_code, _headers = fomo_leaderboard_with_http_info(window, opts) + data + end + + # @param window [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :chain + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_leaderboard_with_http_info(window, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_leaderboard ...' + end + # verify the required parameter 'window' is set + if @api_client.config.client_side_validation && window.nil? + fail ArgumentError, "Missing the required parameter 'window' when calling FomoApi.fomo_leaderboard" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_leaderboard, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_leaderboard, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/fomo/leaderboard/{window}'.sub('{' + 'window' + '}', CGI.escape(window.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'chain'] = opts[:'chain'] if !opts[:'chain'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_leaderboard", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_leaderboard\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :type + # @option opts [String] :chain + # @option opts [String] :since + # @option opts [Integer] :limit + # @return [SuccessResponse] + def fomo_notifications(opts = {}) + data, _status_code, _headers = fomo_notifications_with_http_info(opts) + data + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :type + # @option opts [String] :chain + # @option opts [String] :since + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_notifications_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_notifications ...' + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_notifications, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_notifications, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/fomo/notifications' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'type'] = opts[:'type'] if !opts[:'type'].nil? + query_params[:'chain'] = opts[:'chain'] if !opts[:'chain'].nil? + query_params[:'since'] = opts[:'since'] if !opts[:'since'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_notifications", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_notifications\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param q [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :type + # @option opts [String] :chain + # @option opts [Integer] :limit + # @return [SuccessResponse] + def fomo_search(q, opts = {}) + data, _status_code, _headers = fomo_search_with_http_info(q, opts) + data + end + + # @param q [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :type + # @option opts [String] :chain + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_search_with_http_info(q, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_search ...' + end + # verify the required parameter 'q' is set + if @api_client.config.client_side_validation && q.nil? + fail ArgumentError, "Missing the required parameter 'q' when calling FomoApi.fomo_search" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_search, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_search, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/fomo/search' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'q'] = q + query_params[:'type'] = opts[:'type'] if !opts[:'type'].nil? + query_params[:'chain'] = opts[:'chain'] if !opts[:'chain'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_search", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_search\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :chain + # @option opts [Integer] :limit + # @return [SuccessResponse] + def fomo_thesis(opts = {}) + data, _status_code, _headers = fomo_thesis_with_http_info(opts) + data + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :chain + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_thesis_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_thesis ...' + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_thesis, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_thesis, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/fomo/thesis' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'chain'] = opts[:'chain'] if !opts[:'chain'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_thesis", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_thesis\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param mint [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :network + # @option opts [Integer] :limit + # @return [SuccessResponse] + def fomo_thesis_by_token(mint, opts = {}) + data, _status_code, _headers = fomo_thesis_by_token_with_http_info(mint, opts) + data + end + + # @param mint [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :network + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_thesis_by_token_with_http_info(mint, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_thesis_by_token ...' + end + # verify the required parameter 'mint' is set + if @api_client.config.client_side_validation && mint.nil? + fail ArgumentError, "Missing the required parameter 'mint' when calling FomoApi.fomo_thesis_by_token" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_thesis_by_token, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_thesis_by_token, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/fomo/thesis/token/{mint}'.sub('{' + 'mint' + '}', CGI.escape(mint.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'network'] = opts[:'network'] if !opts[:'network'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_thesis_by_token", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_thesis_by_token\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :chain + # @option opts [String] :sort + # @option opts [Integer] :limit + # @return [SuccessResponse] + def fomo_thesis_by_user(id, opts = {}) + data, _status_code, _headers = fomo_thesis_by_user_with_http_info(id, opts) + data + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :chain + # @option opts [String] :sort + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_thesis_by_user_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_thesis_by_user ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling FomoApi.fomo_thesis_by_user" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_thesis_by_user, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_thesis_by_user, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/fomo/thesis/user/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'chain'] = opts[:'chain'] if !opts[:'chain'].nil? + query_params[:'sort'] = opts[:'sort'] if !opts[:'sort'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_thesis_by_user", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_thesis_by_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param id [String] + # @param address [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @return [SuccessResponse] + def fomo_thesis_by_user_token(id, address, opts = {}) + data, _status_code, _headers = fomo_thesis_by_user_token_with_http_info(id, address, opts) + data + end + + # @param id [String] + # @param address [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_thesis_by_user_token_with_http_info(id, address, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_thesis_by_user_token ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling FomoApi.fomo_thesis_by_user_token" + end + # verify the required parameter 'address' is set + if @api_client.config.client_side_validation && address.nil? + fail ArgumentError, "Missing the required parameter 'address' when calling FomoApi.fomo_thesis_by_user_token" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_thesis_by_user_token, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_thesis_by_user_token, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/fomo/thesis/user/{id}/token/{address}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)).sub('{' + 'address' + '}', CGI.escape(address.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_thesis_by_user_token", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_thesis_by_user_token\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param address [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @return [SuccessResponse] + def fomo_token_holders(address, opts = {}) + data, _status_code, _headers = fomo_token_holders_with_http_info(address, opts) + data + end + + # @param address [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_token_holders_with_http_info(address, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_token_holders ...' + end + # verify the required parameter 'address' is set + if @api_client.config.client_side_validation && address.nil? + fail ArgumentError, "Missing the required parameter 'address' when calling FomoApi.fomo_token_holders" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_token_holders, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_token_holders, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/fomo/tokens/{address}/holders'.sub('{' + 'address' + '}', CGI.escape(address.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_token_holders", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_token_holders\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :chain + # @option opts [Integer] :limit + # @return [SuccessResponse] + def fomo_tokens_graduated(opts = {}) + data, _status_code, _headers = fomo_tokens_graduated_with_http_info(opts) + data + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :chain + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_tokens_graduated_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_tokens_graduated ...' + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_tokens_graduated, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_tokens_graduated, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/fomo/tokens/graduated' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'chain'] = opts[:'chain'] if !opts[:'chain'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_tokens_graduated", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_tokens_graduated\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :chain + # @option opts [Integer] :limit + # @return [SuccessResponse] + def fomo_tokens_most_held(opts = {}) + data, _status_code, _headers = fomo_tokens_most_held_with_http_info(opts) + data + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :chain + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_tokens_most_held_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_tokens_most_held ...' + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_tokens_most_held, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_tokens_most_held, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/fomo/tokens/most-held' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'chain'] = opts[:'chain'] if !opts[:'chain'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_tokens_most_held", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_tokens_most_held\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :chain + # @option opts [Integer] :limit + # @return [SuccessResponse] + def fomo_tokens_trending(opts = {}) + data, _status_code, _headers = fomo_tokens_trending_with_http_info(opts) + data + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :chain + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_tokens_trending_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_tokens_trending ...' + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_tokens_trending, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_tokens_trending, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/fomo/tokens/trending' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'chain'] = opts[:'chain'] if !opts[:'chain'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_tokens_trending", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_tokens_trending\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param trade_id [String] + # @param [Hash] opts the optional parameters + # @return [SuccessResponse] + def fomo_trade(trade_id, opts = {}) + data, _status_code, _headers = fomo_trade_with_http_info(trade_id, opts) + data + end + + # @param trade_id [String] + # @param [Hash] opts the optional parameters + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_trade_with_http_info(trade_id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_trade ...' + end + # verify the required parameter 'trade_id' is set + if @api_client.config.client_side_validation && trade_id.nil? + fail ArgumentError, "Missing the required parameter 'trade_id' when calling FomoApi.fomo_trade" + end + # resource path + local_var_path = '/v1/fomo/trades/{trade_id}'.sub('{' + 'trade_id' + '}', CGI.escape(trade_id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_trade", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_trade\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param handle [String] + # @param [Hash] opts the optional parameters + # @return [SuccessResponse] + def fomo_user_balances(handle, opts = {}) + data, _status_code, _headers = fomo_user_balances_with_http_info(handle, opts) + data + end + + # @param handle [String] + # @param [Hash] opts the optional parameters + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_user_balances_with_http_info(handle, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_user_balances ...' + end + # verify the required parameter 'handle' is set + if @api_client.config.client_side_validation && handle.nil? + fail ArgumentError, "Missing the required parameter 'handle' when calling FomoApi.fomo_user_balances" + end + # resource path + local_var_path = '/v1/fomo/users/{handle}/balances'.sub('{' + 'handle' + '}', CGI.escape(handle.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_user_balances", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_user_balances\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param handle [String] + # @param [Hash] opts the optional parameters + # @return [SuccessResponse] + def fomo_user_profile(handle, opts = {}) + data, _status_code, _headers = fomo_user_profile_with_http_info(handle, opts) + data + end + + # @param handle [String] + # @param [Hash] opts the optional parameters + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_user_profile_with_http_info(handle, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_user_profile ...' + end + # verify the required parameter 'handle' is set + if @api_client.config.client_side_validation && handle.nil? + fail ArgumentError, "Missing the required parameter 'handle' when calling FomoApi.fomo_user_profile" + end + # resource path + local_var_path = '/v1/fomo/users/{handle}'.sub('{' + 'handle' + '}', CGI.escape(handle.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_user_profile", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_user_profile\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param handle [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @return [SuccessResponse] + def fomo_user_trades(handle, opts = {}) + data, _status_code, _headers = fomo_user_trades_with_http_info(handle, opts) + data + end + + # @param handle [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def fomo_user_trades_with_http_info(handle, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: FomoApi.fomo_user_trades ...' + end + # verify the required parameter 'handle' is set + if @api_client.config.client_side_validation && handle.nil? + fail ArgumentError, "Missing the required parameter 'handle' when calling FomoApi.fomo_user_trades" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_user_trades, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling FomoApi.fomo_user_trades, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/fomo/users/{handle}/trades'.sub('{' + 'handle' + '}', CGI.escape(handle.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"FomoApi.fomo_user_trades", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: FomoApi#fomo_user_trades\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + end +end diff --git a/lib/replynodes/generated/replynodes/api/google_api.rb b/lib/replynodes/generated/replynodes/api/google_api.rb new file mode 100644 index 0000000..215fd38 --- /dev/null +++ b/lib/replynodes/generated/replynodes/api/google_api.rb @@ -0,0 +1,122 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'cgi' + +module ReplyNodesGenerated + class GoogleApi + attr_accessor :api_client + + def initialize(api_client = ApiClient.default) + @api_client = api_client + end + # @param text [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :engines + # @option opts [String] :lang + # @option opts [String] :region + # @option opts [String] :date + # @option opts [String] :site + # @option opts [Integer] :limit + # @option opts [Integer] :start + # @option opts [String] :cursor + # @return [SuccessResponse] + def google_search(text, opts = {}) + data, _status_code, _headers = google_search_with_http_info(text, opts) + data + end + + # @param text [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :engines + # @option opts [String] :lang + # @option opts [String] :region + # @option opts [String] :date + # @option opts [String] :site + # @option opts [Integer] :limit + # @option opts [Integer] :start + # @option opts [String] :cursor + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_search_with_http_info(text, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GoogleApi.google_search ...' + end + # verify the required parameter 'text' is set + if @api_client.config.client_side_validation && text.nil? + fail ArgumentError, "Missing the required parameter 'text' when calling GoogleApi.google_search" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GoogleApi.google_search, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GoogleApi.google_search, must be greater than or equal to 1.' + end + + if @api_client.config.client_side_validation && !opts[:'start'].nil? && opts[:'start'] > 100 + fail ArgumentError, 'invalid value for "opts[:"start"]" when calling GoogleApi.google_search, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'start'].nil? && opts[:'start'] < 1 + fail ArgumentError, 'invalid value for "opts[:"start"]" when calling GoogleApi.google_search, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/web/search' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'text'] = text + query_params[:'engines'] = opts[:'engines'] if !opts[:'engines'].nil? + query_params[:'lang'] = opts[:'lang'] if !opts[:'lang'].nil? + query_params[:'region'] = opts[:'region'] if !opts[:'region'].nil? + query_params[:'date'] = opts[:'date'] if !opts[:'date'].nil? + query_params[:'site'] = opts[:'site'] if !opts[:'site'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + query_params[:'start'] = opts[:'start'] if !opts[:'start'].nil? + query_params[:'cursor'] = opts[:'cursor'] if !opts[:'cursor'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GoogleApi.google_search", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GoogleApi#google_search\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + end +end diff --git a/lib/replynodes/generated/replynodes/api/google_maps_api.rb b/lib/replynodes/generated/replynodes/api/google_maps_api.rb new file mode 100644 index 0000000..dd41aee --- /dev/null +++ b/lib/replynodes/generated/replynodes/api/google_maps_api.rb @@ -0,0 +1,220 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'cgi' + +module ReplyNodesGenerated + class GoogleMapsApi + attr_accessor :api_client + + def initialize(api_client = ApiClient.default) + @api_client = api_client + end + # @param place_id [String] + # @param [Hash] opts the optional parameters + # @return [SuccessResponse] + def google_maps_place_details(place_id, opts = {}) + data, _status_code, _headers = google_maps_place_details_with_http_info(place_id, opts) + data + end + + # @param place_id [String] + # @param [Hash] opts the optional parameters + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_maps_place_details_with_http_info(place_id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GoogleMapsApi.google_maps_place_details ...' + end + # verify the required parameter 'place_id' is set + if @api_client.config.client_side_validation && place_id.nil? + fail ArgumentError, "Missing the required parameter 'place_id' when calling GoogleMapsApi.google_maps_place_details" + end + # resource path + local_var_path = '/v1/googlemaps/details/{place_id}'.sub('{' + 'place_id' + '}', CGI.escape(place_id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GoogleMapsApi.google_maps_place_details", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GoogleMapsApi#google_maps_place_details\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param place_id [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @return [SuccessResponse] + def google_maps_place_reviews(place_id, opts = {}) + data, _status_code, _headers = google_maps_place_reviews_with_http_info(place_id, opts) + data + end + + # @param place_id [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_maps_place_reviews_with_http_info(place_id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GoogleMapsApi.google_maps_place_reviews ...' + end + # verify the required parameter 'place_id' is set + if @api_client.config.client_side_validation && place_id.nil? + fail ArgumentError, "Missing the required parameter 'place_id' when calling GoogleMapsApi.google_maps_place_reviews" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GoogleMapsApi.google_maps_place_reviews, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GoogleMapsApi.google_maps_place_reviews, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/googlemaps/reviews/{place_id}'.sub('{' + 'place_id' + '}', CGI.escape(place_id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GoogleMapsApi.google_maps_place_reviews", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GoogleMapsApi#google_maps_place_reviews\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param query [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :lat + # @option opts [String] :lng + # @option opts [String] :radius + # @return [SuccessResponse] + def google_maps_search_places(query, opts = {}) + data, _status_code, _headers = google_maps_search_places_with_http_info(query, opts) + data + end + + # @param query [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :lat + # @option opts [String] :lng + # @option opts [String] :radius + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_maps_search_places_with_http_info(query, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GoogleMapsApi.google_maps_search_places ...' + end + # verify the required parameter 'query' is set + if @api_client.config.client_side_validation && query.nil? + fail ArgumentError, "Missing the required parameter 'query' when calling GoogleMapsApi.google_maps_search_places" + end + # resource path + local_var_path = '/v1/googlemaps/search' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'query'] = query + query_params[:'lat'] = opts[:'lat'] if !opts[:'lat'].nil? + query_params[:'lng'] = opts[:'lng'] if !opts[:'lng'].nil? + query_params[:'radius'] = opts[:'radius'] if !opts[:'radius'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GoogleMapsApi.google_maps_search_places", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GoogleMapsApi#google_maps_search_places\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + end +end diff --git a/lib/replynodes/generated/replynodes/api/google_play_api.rb b/lib/replynodes/generated/replynodes/api/google_play_api.rb new file mode 100644 index 0000000..fdba76c --- /dev/null +++ b/lib/replynodes/generated/replynodes/api/google_play_api.rb @@ -0,0 +1,864 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'cgi' + +module ReplyNodesGenerated + class GooglePlayApi + attr_accessor :api_client + + def initialize(api_client = ApiClient.default) + @api_client = api_client + end + # Fetch a single Google Play app's public detail record + # Fetch a single Google Play app's public detail record. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] Google Play package id (e.g. com.nike.snkrs). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @return [SuccessResponse] + def google_play_app_details(id, opts = {}) + data, _status_code, _headers = google_play_app_details_with_http_info(id, opts) + data + end + + # Fetch a single Google Play app's public detail record + # Fetch a single Google Play app's public detail record. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] Google Play package id (e.g. com.nike.snkrs). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_play_app_details_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GooglePlayApi.google_play_app_details ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling GooglePlayApi.google_play_app_details" + end + # resource path + local_var_path = '/v1/googleplay/app_details/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GooglePlayApi.google_play_app_details", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GooglePlayApi#google_play_app_details\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch a Google Play app's per-storefront availability + # Fetch a Google Play app's per-storefront availability. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] Google Play package id (e.g. com.nike.snkrs). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :countries Comma-separated storefront codes. + # @option opts [String] :language Language code. + # @return [SuccessResponse] + def google_play_availability(id, opts = {}) + data, _status_code, _headers = google_play_availability_with_http_info(id, opts) + data + end + + # Fetch a Google Play app's per-storefront availability + # Fetch a Google Play app's per-storefront availability. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] Google Play package id (e.g. com.nike.snkrs). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :countries Comma-separated storefront codes. + # @option opts [String] :language Language code. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_play_availability_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GooglePlayApi.google_play_availability ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling GooglePlayApi.google_play_availability" + end + # resource path + local_var_path = '/v1/googleplay/availability/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'countries'] = opts[:'countries'] if !opts[:'countries'].nil? + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GooglePlayApi.google_play_availability", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GooglePlayApi#google_play_availability\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # List available Google Play category identifiers + # List available Google Play category identifiers. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @return [SuccessResponse] + def google_play_categories(opts = {}) + data, _status_code, _headers = google_play_categories_with_http_info(opts) + data + end + + # List available Google Play category identifiers + # List available Google Play category identifiers. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_play_categories_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GooglePlayApi.google_play_categories ...' + end + # resource path + local_var_path = '/v1/googleplay/categories' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GooglePlayApi.google_play_categories", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GooglePlayApi#google_play_categories\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch top public apps in a Google Play category + # Fetch top public apps in a Google Play category. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param category [String] Google Play category identifier (e.g. GAME, SHOPPING). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @option opts [Integer] :limit Maximum number of results; values outside 1..50 are rejected. + # @return [SuccessResponse] + def google_play_category_apps(category, opts = {}) + data, _status_code, _headers = google_play_category_apps_with_http_info(category, opts) + data + end + + # Fetch top public apps in a Google Play category + # Fetch top public apps in a Google Play category. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param category [String] Google Play category identifier (e.g. GAME, SHOPPING). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @option opts [Integer] :limit Maximum number of results; values outside 1..50 are rejected. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_play_category_apps_with_http_info(category, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GooglePlayApi.google_play_category_apps ...' + end + # verify the required parameter 'category' is set + if @api_client.config.client_side_validation && category.nil? + fail ArgumentError, "Missing the required parameter 'category' when calling GooglePlayApi.google_play_category_apps" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 50 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GooglePlayApi.google_play_category_apps, must be smaller than or equal to 50.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GooglePlayApi.google_play_category_apps, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/googleplay/category_apps/{category}'.sub('{' + 'category' + '}', CGI.escape(category.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GooglePlayApi.google_play_category_apps", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GooglePlayApi#google_play_category_apps\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch a Google Play app's declared data-safety disclosure + # Fetch a Google Play app's declared data-safety disclosure. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] Google Play package id (e.g. com.nike.snkrs). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @return [SuccessResponse] + def google_play_data_safety(id, opts = {}) + data, _status_code, _headers = google_play_data_safety_with_http_info(id, opts) + data + end + + # Fetch a Google Play app's declared data-safety disclosure + # Fetch a Google Play app's declared data-safety disclosure. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] Google Play package id (e.g. com.nike.snkrs). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_play_data_safety_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GooglePlayApi.google_play_data_safety ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling GooglePlayApi.google_play_data_safety" + end + # resource path + local_var_path = '/v1/googleplay/data_safety/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GooglePlayApi.google_play_data_safety", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GooglePlayApi#google_play_data_safety\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch public apps published by a Google Play developer + # Fetch public apps published by a Google Play developer. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param dev_id [String] Google Play developer id. + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @option opts [Integer] :limit Maximum number of results; values outside 1..50 are rejected. + # @return [SuccessResponse] + def google_play_developer(dev_id, opts = {}) + data, _status_code, _headers = google_play_developer_with_http_info(dev_id, opts) + data + end + + # Fetch public apps published by a Google Play developer + # Fetch public apps published by a Google Play developer. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param dev_id [String] Google Play developer id. + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @option opts [Integer] :limit Maximum number of results; values outside 1..50 are rejected. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_play_developer_with_http_info(dev_id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GooglePlayApi.google_play_developer ...' + end + # verify the required parameter 'dev_id' is set + if @api_client.config.client_side_validation && dev_id.nil? + fail ArgumentError, "Missing the required parameter 'dev_id' when calling GooglePlayApi.google_play_developer" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 50 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GooglePlayApi.google_play_developer, must be smaller than or equal to 50.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GooglePlayApi.google_play_developer, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/googleplay/developer' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'dev_id'] = dev_id + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GooglePlayApi.google_play_developer", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GooglePlayApi#google_play_developer\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch a Google Play app's declared permissions + # Fetch a Google Play app's declared permissions. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] Google Play package id (e.g. com.nike.snkrs). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @return [SuccessResponse] + def google_play_permissions(id, opts = {}) + data, _status_code, _headers = google_play_permissions_with_http_info(id, opts) + data + end + + # Fetch a Google Play app's declared permissions + # Fetch a Google Play app's declared permissions. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] Google Play package id (e.g. com.nike.snkrs). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_play_permissions_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GooglePlayApi.google_play_permissions ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling GooglePlayApi.google_play_permissions" + end + # resource path + local_var_path = '/v1/googleplay/permissions/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GooglePlayApi.google_play_permissions", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GooglePlayApi#google_play_permissions\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch public reviews for a Google Play app + # Fetch public reviews for a Google Play app. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] Google Play package id (e.g. com.nike.snkrs). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @option opts [Integer] :limit Maximum number of results; values outside 1..50 are rejected. + # @option opts [Integer] :sort Upstream review sort order. + # @option opts [Integer] :score Filter reviews to this star rating (1..5). + # @option opts [String] :next_token Pagination token from a previous reviews response. + # @return [SuccessResponse] + def google_play_reviews(id, opts = {}) + data, _status_code, _headers = google_play_reviews_with_http_info(id, opts) + data + end + + # Fetch public reviews for a Google Play app + # Fetch public reviews for a Google Play app. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] Google Play package id (e.g. com.nike.snkrs). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @option opts [Integer] :limit Maximum number of results; values outside 1..50 are rejected. + # @option opts [Integer] :sort Upstream review sort order. + # @option opts [Integer] :score Filter reviews to this star rating (1..5). + # @option opts [String] :next_token Pagination token from a previous reviews response. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_play_reviews_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GooglePlayApi.google_play_reviews ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling GooglePlayApi.google_play_reviews" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 50 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GooglePlayApi.google_play_reviews, must be smaller than or equal to 50.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GooglePlayApi.google_play_reviews, must be greater than or equal to 1.' + end + + if @api_client.config.client_side_validation && !opts[:'score'].nil? && opts[:'score'] > 5 + fail ArgumentError, 'invalid value for "opts[:"score"]" when calling GooglePlayApi.google_play_reviews, must be smaller than or equal to 5.' + end + + if @api_client.config.client_side_validation && !opts[:'score'].nil? && opts[:'score'] < 1 + fail ArgumentError, 'invalid value for "opts[:"score"]" when calling GooglePlayApi.google_play_reviews, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/googleplay/reviews/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + query_params[:'sort'] = opts[:'sort'] if !opts[:'sort'].nil? + query_params[:'score'] = opts[:'score'] if !opts[:'score'].nil? + query_params[:'next_token'] = opts[:'next_token'] if !opts[:'next_token'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GooglePlayApi.google_play_reviews", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GooglePlayApi#google_play_reviews\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Search public Google Play applications by term + # Search public Google Play applications by term. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param term [String] Search term. + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @option opts [Integer] :limit Maximum number of results; values outside 1..50 are rejected. + # @return [SuccessResponse] + def google_play_search(term, opts = {}) + data, _status_code, _headers = google_play_search_with_http_info(term, opts) + data + end + + # Search public Google Play applications by term + # Search public Google Play applications by term. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param term [String] Search term. + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @option opts [Integer] :limit Maximum number of results; values outside 1..50 are rejected. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_play_search_with_http_info(term, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GooglePlayApi.google_play_search ...' + end + # verify the required parameter 'term' is set + if @api_client.config.client_side_validation && term.nil? + fail ArgumentError, "Missing the required parameter 'term' when calling GooglePlayApi.google_play_search" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 50 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GooglePlayApi.google_play_search, must be smaller than or equal to 50.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GooglePlayApi.google_play_search, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/googleplay/search' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'term'] = term + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GooglePlayApi.google_play_search", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GooglePlayApi#google_play_search\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch apps similar to a given Google Play package + # Fetch apps similar to a given Google Play package. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] Google Play package id (e.g. com.nike.snkrs). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @option opts [Integer] :limit Maximum number of results; values outside 1..50 are rejected. + # @return [SuccessResponse] + def google_play_similar_apps(id, opts = {}) + data, _status_code, _headers = google_play_similar_apps_with_http_info(id, opts) + data + end + + # Fetch apps similar to a given Google Play package + # Fetch apps similar to a given Google Play package. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [String] Google Play package id (e.g. com.nike.snkrs). + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @option opts [Integer] :limit Maximum number of results; values outside 1..50 are rejected. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_play_similar_apps_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GooglePlayApi.google_play_similar_apps ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling GooglePlayApi.google_play_similar_apps" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 50 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GooglePlayApi.google_play_similar_apps, must be smaller than or equal to 50.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GooglePlayApi.google_play_similar_apps, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/googleplay/similar_apps/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GooglePlayApi.google_play_similar_apps", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GooglePlayApi#google_play_similar_apps\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch Google Play search-term suggestions + # Fetch Google Play search-term suggestions. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param term [String] Search term. + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @option opts [Integer] :limit Maximum number of results; values outside 1..50 are rejected. + # @return [SuccessResponse] + def google_play_suggest(term, opts = {}) + data, _status_code, _headers = google_play_suggest_with_http_info(term, opts) + data + end + + # Fetch Google Play search-term suggestions + # Fetch Google Play search-term suggestions. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param term [String] Search term. + # @param [Hash] opts the optional parameters + # @option opts [String] :country Two-letter storefront code. + # @option opts [String] :language Language code. + # @option opts [Integer] :limit Maximum number of results; values outside 1..50 are rejected. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_play_suggest_with_http_info(term, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GooglePlayApi.google_play_suggest ...' + end + # verify the required parameter 'term' is set + if @api_client.config.client_side_validation && term.nil? + fail ArgumentError, "Missing the required parameter 'term' when calling GooglePlayApi.google_play_suggest" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 50 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GooglePlayApi.google_play_suggest, must be smaller than or equal to 50.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GooglePlayApi.google_play_suggest, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/googleplay/suggest' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'term'] = term + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GooglePlayApi.google_play_suggest", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GooglePlayApi#google_play_suggest\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + end +end diff --git a/lib/replynodes/generated/replynodes/api/google_shopping_api.rb b/lib/replynodes/generated/replynodes/api/google_shopping_api.rb new file mode 100644 index 0000000..365d636 --- /dev/null +++ b/lib/replynodes/generated/replynodes/api/google_shopping_api.rb @@ -0,0 +1,196 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'cgi' + +module ReplyNodesGenerated + class GoogleShoppingApi + attr_accessor :api_client + + def initialize(api_client = ApiClient.default) + @api_client = api_client + end + # @param text [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :product_id + # @option opts [String] :lang + # @option opts [String] :country + # @option opts [String] :domain + # @option opts [Integer] :limit + # @return [SuccessResponse] + def google_shopping_product_offers(text, opts = {}) + data, _status_code, _headers = google_shopping_product_offers_with_http_info(text, opts) + data + end + + # @param text [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :product_id + # @option opts [String] :lang + # @option opts [String] :country + # @option opts [String] :domain + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_shopping_product_offers_with_http_info(text, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GoogleShoppingApi.google_shopping_product_offers ...' + end + # verify the required parameter 'text' is set + if @api_client.config.client_side_validation && text.nil? + fail ArgumentError, "Missing the required parameter 'text' when calling GoogleShoppingApi.google_shopping_product_offers" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GoogleShoppingApi.google_shopping_product_offers, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GoogleShoppingApi.google_shopping_product_offers, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/googleshopping/product_offers' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'text'] = text + query_params[:'product_id'] = opts[:'product_id'] if !opts[:'product_id'].nil? + query_params[:'lang'] = opts[:'lang'] if !opts[:'lang'].nil? + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'domain'] = opts[:'domain'] if !opts[:'domain'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GoogleShoppingApi.google_shopping_product_offers", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GoogleShoppingApi#google_shopping_product_offers\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param text [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :lang + # @option opts [String] :country + # @option opts [String] :domain + # @option opts [Integer] :limit + # @option opts [Integer] :start + # @return [SuccessResponse] + def google_shopping_search(text, opts = {}) + data, _status_code, _headers = google_shopping_search_with_http_info(text, opts) + data + end + + # @param text [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :lang + # @option opts [String] :country + # @option opts [String] :domain + # @option opts [Integer] :limit + # @option opts [Integer] :start + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def google_shopping_search_with_http_info(text, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: GoogleShoppingApi.google_shopping_search ...' + end + # verify the required parameter 'text' is set + if @api_client.config.client_side_validation && text.nil? + fail ArgumentError, "Missing the required parameter 'text' when calling GoogleShoppingApi.google_shopping_search" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GoogleShoppingApi.google_shopping_search, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling GoogleShoppingApi.google_shopping_search, must be greater than or equal to 1.' + end + + if @api_client.config.client_side_validation && !opts[:'start'].nil? && opts[:'start'] > 100 + fail ArgumentError, 'invalid value for "opts[:"start"]" when calling GoogleShoppingApi.google_shopping_search, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'start'].nil? && opts[:'start'] < 1 + fail ArgumentError, 'invalid value for "opts[:"start"]" when calling GoogleShoppingApi.google_shopping_search, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/googleshopping/search' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'text'] = text + query_params[:'lang'] = opts[:'lang'] if !opts[:'lang'].nil? + query_params[:'country'] = opts[:'country'] if !opts[:'country'].nil? + query_params[:'domain'] = opts[:'domain'] if !opts[:'domain'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + query_params[:'start'] = opts[:'start'] if !opts[:'start'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"GoogleShoppingApi.google_shopping_search", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: GoogleShoppingApi#google_shopping_search\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + end +end diff --git a/lib/replynodes/generated/replynodes/api/hacker_news_api.rb b/lib/replynodes/generated/replynodes/api/hacker_news_api.rb new file mode 100644 index 0000000..cc1f549 --- /dev/null +++ b/lib/replynodes/generated/replynodes/api/hacker_news_api.rb @@ -0,0 +1,694 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'cgi' + +module ReplyNodesGenerated + class HackerNewsApi + attr_accessor :api_client + + def initialize(api_client = ApiClient.default) + @api_client = api_client + end + # Fetch a single Hacker News item and its comment tree + # Fetch a single Hacker News item and its comment tree. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [Integer] Hacker News item id. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :depth Maximum comment-tree depth to resolve; values outside 1..10 are rejected. + # @return [SuccessResponse] + def hacker_news_item(id, opts = {}) + data, _status_code, _headers = hacker_news_item_with_http_info(id, opts) + data + end + + # Fetch a single Hacker News item and its comment tree + # Fetch a single Hacker News item and its comment tree. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param id [Integer] Hacker News item id. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :depth Maximum comment-tree depth to resolve; values outside 1..10 are rejected. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def hacker_news_item_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: HackerNewsApi.hacker_news_item ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling HackerNewsApi.hacker_news_item" + end + if @api_client.config.client_side_validation && !opts[:'depth'].nil? && opts[:'depth'] > 10 + fail ArgumentError, 'invalid value for "opts[:"depth"]" when calling HackerNewsApi.hacker_news_item, must be smaller than or equal to 10.' + end + + if @api_client.config.client_side_validation && !opts[:'depth'].nil? && opts[:'depth'] < 1 + fail ArgumentError, 'invalid value for "opts[:"depth"]" when calling HackerNewsApi.hacker_news_item, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/hackernews/item/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'depth'] = opts[:'depth'] if !opts[:'depth'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"HackerNewsApi.hacker_news_item", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: HackerNewsApi#hacker_news_item\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Search Hacker News via Algolia + # Search Hacker News via Algolia. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param q [String] Search query. + # @param [Hash] opts the optional parameters + # @option opts [String] :tags Algolia HN Search tag filter (e.g. story, comment, ask_hn). + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [SuccessResponse] + def hacker_news_search(q, opts = {}) + data, _status_code, _headers = hacker_news_search_with_http_info(q, opts) + data + end + + # Search Hacker News via Algolia + # Search Hacker News via Algolia. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param q [String] Search query. + # @param [Hash] opts the optional parameters + # @option opts [String] :tags Algolia HN Search tag filter (e.g. story, comment, ask_hn). + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def hacker_news_search_with_http_info(q, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: HackerNewsApi.hacker_news_search ...' + end + # verify the required parameter 'q' is set + if @api_client.config.client_side_validation && q.nil? + fail ArgumentError, "Missing the required parameter 'q' when calling HackerNewsApi.hacker_news_search" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_search, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_search, must be greater than or equal to 1.' + end + + if @api_client.config.client_side_validation && !opts[:'page'].nil? && opts[:'page'] < 0 + fail ArgumentError, 'invalid value for "opts[:"page"]" when calling HackerNewsApi.hacker_news_search, must be greater than or equal to 0.' + end + + # resource path + local_var_path = '/v1/hackernews/search' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'q'] = q + query_params[:'tags'] = opts[:'tags'] if !opts[:'tags'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + query_params[:'page'] = opts[:'page'] if !opts[:'page'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"HackerNewsApi.hacker_news_search", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: HackerNewsApi#hacker_news_search\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch current Ask HN stories + # Fetch current Ask HN stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [SuccessResponse] + def hacker_news_stories_ask(opts = {}) + data, _status_code, _headers = hacker_news_stories_ask_with_http_info(opts) + data + end + + # Fetch current Ask HN stories + # Fetch current Ask HN stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def hacker_news_stories_ask_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: HackerNewsApi.hacker_news_stories_ask ...' + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_stories_ask, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_stories_ask, must be greater than or equal to 1.' + end + + if @api_client.config.client_side_validation && !opts[:'page'].nil? && opts[:'page'] < 1 + fail ArgumentError, 'invalid value for "opts[:"page"]" when calling HackerNewsApi.hacker_news_stories_ask, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/hackernews/stories_ask' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + query_params[:'page'] = opts[:'page'] if !opts[:'page'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"HackerNewsApi.hacker_news_stories_ask", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: HackerNewsApi#hacker_news_stories_ask\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch current Hacker News best stories + # Fetch current Hacker News best stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [SuccessResponse] + def hacker_news_stories_best(opts = {}) + data, _status_code, _headers = hacker_news_stories_best_with_http_info(opts) + data + end + + # Fetch current Hacker News best stories + # Fetch current Hacker News best stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def hacker_news_stories_best_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: HackerNewsApi.hacker_news_stories_best ...' + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_stories_best, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_stories_best, must be greater than or equal to 1.' + end + + if @api_client.config.client_side_validation && !opts[:'page'].nil? && opts[:'page'] < 1 + fail ArgumentError, 'invalid value for "opts[:"page"]" when calling HackerNewsApi.hacker_news_stories_best, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/hackernews/stories_best' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + query_params[:'page'] = opts[:'page'] if !opts[:'page'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"HackerNewsApi.hacker_news_stories_best", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: HackerNewsApi#hacker_news_stories_best\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch current Hacker News job postings + # Fetch current Hacker News job postings. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [SuccessResponse] + def hacker_news_stories_job(opts = {}) + data, _status_code, _headers = hacker_news_stories_job_with_http_info(opts) + data + end + + # Fetch current Hacker News job postings + # Fetch current Hacker News job postings. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def hacker_news_stories_job_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: HackerNewsApi.hacker_news_stories_job ...' + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_stories_job, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_stories_job, must be greater than or equal to 1.' + end + + if @api_client.config.client_side_validation && !opts[:'page'].nil? && opts[:'page'] < 1 + fail ArgumentError, 'invalid value for "opts[:"page"]" when calling HackerNewsApi.hacker_news_stories_job, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/hackernews/stories_job' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + query_params[:'page'] = opts[:'page'] if !opts[:'page'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"HackerNewsApi.hacker_news_stories_job", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: HackerNewsApi#hacker_news_stories_job\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch current Hacker News new stories + # Fetch current Hacker News new stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [SuccessResponse] + def hacker_news_stories_new(opts = {}) + data, _status_code, _headers = hacker_news_stories_new_with_http_info(opts) + data + end + + # Fetch current Hacker News new stories + # Fetch current Hacker News new stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def hacker_news_stories_new_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: HackerNewsApi.hacker_news_stories_new ...' + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_stories_new, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_stories_new, must be greater than or equal to 1.' + end + + if @api_client.config.client_side_validation && !opts[:'page'].nil? && opts[:'page'] < 1 + fail ArgumentError, 'invalid value for "opts[:"page"]" when calling HackerNewsApi.hacker_news_stories_new, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/hackernews/stories_new' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + query_params[:'page'] = opts[:'page'] if !opts[:'page'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"HackerNewsApi.hacker_news_stories_new", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: HackerNewsApi#hacker_news_stories_new\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch current Show HN stories + # Fetch current Show HN stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [SuccessResponse] + def hacker_news_stories_show(opts = {}) + data, _status_code, _headers = hacker_news_stories_show_with_http_info(opts) + data + end + + # Fetch current Show HN stories + # Fetch current Show HN stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def hacker_news_stories_show_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: HackerNewsApi.hacker_news_stories_show ...' + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_stories_show, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_stories_show, must be greater than or equal to 1.' + end + + if @api_client.config.client_side_validation && !opts[:'page'].nil? && opts[:'page'] < 1 + fail ArgumentError, 'invalid value for "opts[:"page"]" when calling HackerNewsApi.hacker_news_stories_show, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/hackernews/stories_show' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + query_params[:'page'] = opts[:'page'] if !opts[:'page'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"HackerNewsApi.hacker_news_stories_show", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: HackerNewsApi#hacker_news_stories_show\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch current Hacker News top stories + # Fetch current Hacker News top stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [SuccessResponse] + def hacker_news_stories_top(opts = {}) + data, _status_code, _headers = hacker_news_stories_top_with_http_info(opts) + data + end + + # Fetch current Hacker News top stories + # Fetch current Hacker News top stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit Maximum number of results; values outside 1..100 are rejected. + # @option opts [Integer] :page Result page. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def hacker_news_stories_top_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: HackerNewsApi.hacker_news_stories_top ...' + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_stories_top, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling HackerNewsApi.hacker_news_stories_top, must be greater than or equal to 1.' + end + + if @api_client.config.client_side_validation && !opts[:'page'].nil? && opts[:'page'] < 1 + fail ArgumentError, 'invalid value for "opts[:"page"]" when calling HackerNewsApi.hacker_news_stories_top, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/hackernews/stories_top' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + query_params[:'page'] = opts[:'page'] if !opts[:'page'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"HackerNewsApi.hacker_news_stories_top", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: HackerNewsApi#hacker_news_stories_top\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch a public Hacker News user profile + # Fetch a public Hacker News user profile. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param handle [String] Hacker News username. + # @param [Hash] opts the optional parameters + # @return [SuccessResponse] + def hacker_news_user(handle, opts = {}) + data, _status_code, _headers = hacker_news_user_with_http_info(handle, opts) + data + end + + # Fetch a public Hacker News user profile + # Fetch a public Hacker News user profile. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway. + # @param handle [String] Hacker News username. + # @param [Hash] opts the optional parameters + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def hacker_news_user_with_http_info(handle, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: HackerNewsApi.hacker_news_user ...' + end + # verify the required parameter 'handle' is set + if @api_client.config.client_side_validation && handle.nil? + fail ArgumentError, "Missing the required parameter 'handle' when calling HackerNewsApi.hacker_news_user" + end + # resource path + local_var_path = '/v1/hackernews/user/{handle}'.sub('{' + 'handle' + '}', CGI.escape(handle.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"HackerNewsApi.hacker_news_user", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: HackerNewsApi#hacker_news_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + end +end diff --git a/lib/replynodes/generated/replynodes/api/instagram_api.rb b/lib/replynodes/generated/replynodes/api/instagram_api.rb new file mode 100644 index 0000000..d4a6322 --- /dev/null +++ b/lib/replynodes/generated/replynodes/api/instagram_api.rb @@ -0,0 +1,148 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'cgi' + +module ReplyNodesGenerated + class InstagramApi + attr_accessor :api_client + + def initialize(api_client = ApiClient.default) + @api_client = api_client + end + # @param [Hash] opts the optional parameters + # @option opts [String] :username + # @option opts [Integer] :limit + # @option opts [String] :cursor + # @return [SuccessResponse] + def instagram_posts(opts = {}) + data, _status_code, _headers = instagram_posts_with_http_info(opts) + data + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :username + # @option opts [Integer] :limit + # @option opts [String] :cursor + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def instagram_posts_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: InstagramApi.instagram_posts ...' + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling InstagramApi.instagram_posts, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling InstagramApi.instagram_posts, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/instagram/posts' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'username'] = opts[:'username'] if !opts[:'username'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + query_params[:'cursor'] = opts[:'cursor'] if !opts[:'cursor'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"InstagramApi.instagram_posts", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: InstagramApi#instagram_posts\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :username + # @return [SuccessResponse] + def instagram_profile(opts = {}) + data, _status_code, _headers = instagram_profile_with_http_info(opts) + data + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :username + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def instagram_profile_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: InstagramApi.instagram_profile ...' + end + # resource path + local_var_path = '/v1/instagram/profile' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'username'] = opts[:'username'] if !opts[:'username'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"InstagramApi.instagram_profile", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: InstagramApi#instagram_profile\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + end +end diff --git a/lib/replynodes/generated/replynodes/api/reddit_api.rb b/lib/replynodes/generated/replynodes/api/reddit_api.rb new file mode 100644 index 0000000..76d2d52 --- /dev/null +++ b/lib/replynodes/generated/replynodes/api/reddit_api.rb @@ -0,0 +1,451 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'cgi' + +module ReplyNodesGenerated + class RedditApi + attr_accessor :api_client + + def initialize(api_client = ApiClient.default) + @api_client = api_client + end + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :context + # @return [SuccessResponse] + def reddit_post_by_id(id, opts = {}) + data, _status_code, _headers = reddit_post_by_id_with_http_info(id, opts) + data + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :context + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def reddit_post_by_id_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: RedditApi.reddit_post_by_id ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling RedditApi.reddit_post_by_id" + end + # resource path + local_var_path = '/v1/reddit/post_by_id/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'context'] = opts[:'context'] if !opts[:'context'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"RedditApi.reddit_post_by_id", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: RedditApi#reddit_post_by_id\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :permalink + # @option opts [String] :context + # @return [SuccessResponse] + def reddit_post_by_permalink(opts = {}) + data, _status_code, _headers = reddit_post_by_permalink_with_http_info(opts) + data + end + + # @param [Hash] opts the optional parameters + # @option opts [String] :permalink + # @option opts [String] :context + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def reddit_post_by_permalink_with_http_info(opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: RedditApi.reddit_post_by_permalink ...' + end + # resource path + local_var_path = '/v1/reddit/post_by_permalink' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'permalink'] = opts[:'permalink'] if !opts[:'permalink'].nil? + query_params[:'context'] = opts[:'context'] if !opts[:'context'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"RedditApi.reddit_post_by_permalink", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: RedditApi#reddit_post_by_permalink\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param query [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :sort + # @option opts [Integer] :limit + # @option opts [String] :time_filter + # @return [SuccessResponse] + def reddit_search(query, opts = {}) + data, _status_code, _headers = reddit_search_with_http_info(query, opts) + data + end + + # @param query [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :sort + # @option opts [Integer] :limit + # @option opts [String] :time_filter + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def reddit_search_with_http_info(query, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: RedditApi.reddit_search ...' + end + # verify the required parameter 'query' is set + if @api_client.config.client_side_validation && query.nil? + fail ArgumentError, "Missing the required parameter 'query' when calling RedditApi.reddit_search" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling RedditApi.reddit_search, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling RedditApi.reddit_search, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/reddit/search_posts' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'query'] = query + query_params[:'sort'] = opts[:'sort'] if !opts[:'sort'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + query_params[:'time_filter'] = opts[:'time_filter'] if !opts[:'time_filter'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"RedditApi.reddit_search", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: RedditApi#reddit_search\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param subreddit [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :category + # @option opts [String] :time_filter + # @option opts [String] :sort + # @option opts [Integer] :limit + # @return [SuccessResponse] + def reddit_subreddit_posts(subreddit, opts = {}) + data, _status_code, _headers = reddit_subreddit_posts_with_http_info(subreddit, opts) + data + end + + # @param subreddit [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :category + # @option opts [String] :time_filter + # @option opts [String] :sort + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def reddit_subreddit_posts_with_http_info(subreddit, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: RedditApi.reddit_subreddit_posts ...' + end + # verify the required parameter 'subreddit' is set + if @api_client.config.client_side_validation && subreddit.nil? + fail ArgumentError, "Missing the required parameter 'subreddit' when calling RedditApi.reddit_subreddit_posts" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling RedditApi.reddit_subreddit_posts, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling RedditApi.reddit_subreddit_posts, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/reddit/subreddit_posts/{subreddit}'.sub('{' + 'subreddit' + '}', CGI.escape(subreddit.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'category'] = opts[:'category'] if !opts[:'category'].nil? + query_params[:'time_filter'] = opts[:'time_filter'] if !opts[:'time_filter'].nil? + query_params[:'sort'] = opts[:'sort'] if !opts[:'sort'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"RedditApi.reddit_subreddit_posts", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: RedditApi#reddit_subreddit_posts\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param username [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @option opts [String] :sort + # @return [SuccessResponse] + def reddit_user_activity(username, opts = {}) + data, _status_code, _headers = reddit_user_activity_with_http_info(username, opts) + data + end + + # @param username [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @option opts [String] :sort + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def reddit_user_activity_with_http_info(username, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: RedditApi.reddit_user_activity ...' + end + # verify the required parameter 'username' is set + if @api_client.config.client_side_validation && username.nil? + fail ArgumentError, "Missing the required parameter 'username' when calling RedditApi.reddit_user_activity" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling RedditApi.reddit_user_activity, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling RedditApi.reddit_user_activity, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/reddit/user_activity/{username}'.sub('{' + 'username' + '}', CGI.escape(username.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + query_params[:'sort'] = opts[:'sort'] if !opts[:'sort'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"RedditApi.reddit_user_activity", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: RedditApi#reddit_user_activity\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param username [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :category + # @option opts [String] :time_filter + # @option opts [String] :sort + # @option opts [Integer] :limit + # @return [SuccessResponse] + def reddit_user_posts(username, opts = {}) + data, _status_code, _headers = reddit_user_posts_with_http_info(username, opts) + data + end + + # @param username [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :category + # @option opts [String] :time_filter + # @option opts [String] :sort + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def reddit_user_posts_with_http_info(username, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: RedditApi.reddit_user_posts ...' + end + # verify the required parameter 'username' is set + if @api_client.config.client_side_validation && username.nil? + fail ArgumentError, "Missing the required parameter 'username' when calling RedditApi.reddit_user_posts" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 100 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling RedditApi.reddit_user_posts, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling RedditApi.reddit_user_posts, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/reddit/user_posts/{username}'.sub('{' + 'username' + '}', CGI.escape(username.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'category'] = opts[:'category'] if !opts[:'category'].nil? + query_params[:'time_filter'] = opts[:'time_filter'] if !opts[:'time_filter'].nil? + query_params[:'sort'] = opts[:'sort'] if !opts[:'sort'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"RedditApi.reddit_user_posts", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: RedditApi#reddit_user_posts\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + end +end diff --git a/lib/replynodes/generated/replynodes/api/tiktok_api.rb b/lib/replynodes/generated/replynodes/api/tiktok_api.rb new file mode 100644 index 0000000..f96481e --- /dev/null +++ b/lib/replynodes/generated/replynodes/api/tiktok_api.rb @@ -0,0 +1,213 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'cgi' + +module ReplyNodesGenerated + class TiktokApi + attr_accessor :api_client + + def initialize(api_client = ApiClient.default) + @api_client = api_client + end + # @param id [String] + # @param [Hash] opts the optional parameters + # @return [SuccessResponse] + def tiktok_post(id, opts = {}) + data, _status_code, _headers = tiktok_post_with_http_info(id, opts) + data + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def tiktok_post_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: TiktokApi.tiktok_post ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling TiktokApi.tiktok_post" + end + # resource path + local_var_path = '/v1/tiktok/post/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"TiktokApi.tiktok_post", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: TiktokApi#tiktok_post\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param handle [String] + # @param [Hash] opts the optional parameters + # @return [SuccessResponse] + def tiktok_user(handle, opts = {}) + data, _status_code, _headers = tiktok_user_with_http_info(handle, opts) + data + end + + # @param handle [String] + # @param [Hash] opts the optional parameters + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def tiktok_user_with_http_info(handle, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: TiktokApi.tiktok_user ...' + end + # verify the required parameter 'handle' is set + if @api_client.config.client_side_validation && handle.nil? + fail ArgumentError, "Missing the required parameter 'handle' when calling TiktokApi.tiktok_user" + end + # resource path + local_var_path = '/v1/tiktok/user/{handle}'.sub('{' + 'handle' + '}', CGI.escape(handle.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"TiktokApi.tiktok_user", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: TiktokApi#tiktok_user\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param handle [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :count + # @option opts [String] :cursor + # @return [SuccessResponse] + def tiktok_user_posts(handle, opts = {}) + data, _status_code, _headers = tiktok_user_posts_with_http_info(handle, opts) + data + end + + # @param handle [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :count + # @option opts [String] :cursor + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def tiktok_user_posts_with_http_info(handle, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: TiktokApi.tiktok_user_posts ...' + end + # verify the required parameter 'handle' is set + if @api_client.config.client_side_validation && handle.nil? + fail ArgumentError, "Missing the required parameter 'handle' when calling TiktokApi.tiktok_user_posts" + end + if @api_client.config.client_side_validation && !opts[:'count'].nil? && opts[:'count'] > 100 + fail ArgumentError, 'invalid value for "opts[:"count"]" when calling TiktokApi.tiktok_user_posts, must be smaller than or equal to 100.' + end + + if @api_client.config.client_side_validation && !opts[:'count'].nil? && opts[:'count'] < 1 + fail ArgumentError, 'invalid value for "opts[:"count"]" when calling TiktokApi.tiktok_user_posts, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/tiktok/user_posts/{handle}'.sub('{' + 'handle' + '}', CGI.escape(handle.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'count'] = opts[:'count'] if !opts[:'count'].nil? + query_params[:'cursor'] = opts[:'cursor'] if !opts[:'cursor'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"TiktokApi.tiktok_user_posts", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: TiktokApi#tiktok_user_posts\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + end +end diff --git a/lib/replynodes/generated/replynodes/api/web_api.rb b/lib/replynodes/generated/replynodes/api/web_api.rb new file mode 100644 index 0000000..0c67652 --- /dev/null +++ b/lib/replynodes/generated/replynodes/api/web_api.rb @@ -0,0 +1,306 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'cgi' + +module ReplyNodesGenerated + class WebApi + attr_accessor :api_client + + def initialize(api_client = ApiClient.default) + @api_client = api_client + end + # Extract public brand identity for a site + # Extract logos, colors, fonts, and basic public metadata for a site's brand identity. + # @param url [String] Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address. + # @param [Hash] opts the optional parameters + # @return [SuccessResponse] + def web_brand(url, opts = {}) + data, _status_code, _headers = web_brand_with_http_info(url, opts) + data + end + + # Extract public brand identity for a site + # Extract logos, colors, fonts, and basic public metadata for a site's brand identity. + # @param url [String] Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address. + # @param [Hash] opts the optional parameters + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def web_brand_with_http_info(url, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: WebApi.web_brand ...' + end + # verify the required parameter 'url' is set + if @api_client.config.client_side_validation && url.nil? + fail ArgumentError, "Missing the required parameter 'url' when calling WebApi.web_brand" + end + # resource path + local_var_path = '/v1/webcontext/brand' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'url'] = url + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"WebApi.web_brand", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: WebApi#web_brand\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Crawl same-origin links from a URL + # Crawl same-origin links starting from a URL and return normalized page results. max_pages/max_depth are clamped server-side regardless of the requested value. + # @param url [String] Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :max_pages Maximum pages to crawl; clamped to 1..50. + # @option opts [Integer] :max_depth Maximum link depth; clamped to 1..3. + # @return [SuccessResponse] + def web_crawl(url, opts = {}) + data, _status_code, _headers = web_crawl_with_http_info(url, opts) + data + end + + # Crawl same-origin links from a URL + # Crawl same-origin links starting from a URL and return normalized page results. max_pages/max_depth are clamped server-side regardless of the requested value. + # @param url [String] Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address. + # @param [Hash] opts the optional parameters + # @option opts [Integer] :max_pages Maximum pages to crawl; clamped to 1..50. + # @option opts [Integer] :max_depth Maximum link depth; clamped to 1..3. + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def web_crawl_with_http_info(url, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: WebApi.web_crawl ...' + end + # verify the required parameter 'url' is set + if @api_client.config.client_side_validation && url.nil? + fail ArgumentError, "Missing the required parameter 'url' when calling WebApi.web_crawl" + end + if @api_client.config.client_side_validation && !opts[:'max_pages'].nil? && opts[:'max_pages'] > 50 + fail ArgumentError, 'invalid value for "opts[:"max_pages"]" when calling WebApi.web_crawl, must be smaller than or equal to 50.' + end + + if @api_client.config.client_side_validation && !opts[:'max_pages'].nil? && opts[:'max_pages'] < 1 + fail ArgumentError, 'invalid value for "opts[:"max_pages"]" when calling WebApi.web_crawl, must be greater than or equal to 1.' + end + + if @api_client.config.client_side_validation && !opts[:'max_depth'].nil? && opts[:'max_depth'] > 3 + fail ArgumentError, 'invalid value for "opts[:"max_depth"]" when calling WebApi.web_crawl, must be smaller than or equal to 3.' + end + + if @api_client.config.client_side_validation && !opts[:'max_depth'].nil? && opts[:'max_depth'] < 1 + fail ArgumentError, 'invalid value for "opts[:"max_depth"]" when calling WebApi.web_crawl, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/webcontext/crawl' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'url'] = url + query_params[:'max_pages'] = opts[:'max_pages'] if !opts[:'max_pages'].nil? + query_params[:'max_depth'] = opts[:'max_depth'] if !opts[:'max_depth'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"WebApi.web_crawl", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: WebApi#web_crawl\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Discover URLs belonging to a site + # Discover URLs belonging to a site without extracting page content. Results are deduplicated. + # @param url [String] Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address. + # @param [Hash] opts the optional parameters + # @return [SuccessResponse] + def web_map(url, opts = {}) + data, _status_code, _headers = web_map_with_http_info(url, opts) + data + end + + # Discover URLs belonging to a site + # Discover URLs belonging to a site without extracting page content. Results are deduplicated. + # @param url [String] Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address. + # @param [Hash] opts the optional parameters + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def web_map_with_http_info(url, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: WebApi.web_map ...' + end + # verify the required parameter 'url' is set + if @api_client.config.client_side_validation && url.nil? + fail ArgumentError, "Missing the required parameter 'url' when calling WebApi.web_map" + end + # resource path + local_var_path = '/v1/webcontext/map' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'url'] = url + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"WebApi.web_map", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: WebApi#web_map\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # Fetch one URL as clean Markdown + # Fetch one URL and return clean, main-content Markdown plus normalized metadata, links, and images. Backed by a privately deployed webclaw-server instance; upstream implementation details are never exposed. + # @param url [String] Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address. + # @param [Hash] opts the optional parameters + # @option opts [String] :include_selectors Comma-separated CSS selectors to include (e.g. \"article,.content\"). + # @option opts [String] :exclude_selectors Comma-separated CSS selectors to exclude (e.g. \"nav,.sidebar,footer\"). + # @return [SuccessResponse] + def web_scrape(url, opts = {}) + data, _status_code, _headers = web_scrape_with_http_info(url, opts) + data + end + + # Fetch one URL as clean Markdown + # Fetch one URL and return clean, main-content Markdown plus normalized metadata, links, and images. Backed by a privately deployed webclaw-server instance; upstream implementation details are never exposed. + # @param url [String] Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address. + # @param [Hash] opts the optional parameters + # @option opts [String] :include_selectors Comma-separated CSS selectors to include (e.g. \"article,.content\"). + # @option opts [String] :exclude_selectors Comma-separated CSS selectors to exclude (e.g. \"nav,.sidebar,footer\"). + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def web_scrape_with_http_info(url, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: WebApi.web_scrape ...' + end + # verify the required parameter 'url' is set + if @api_client.config.client_side_validation && url.nil? + fail ArgumentError, "Missing the required parameter 'url' when calling WebApi.web_scrape" + end + # resource path + local_var_path = '/v1/webcontext/scrape' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'url'] = url + query_params[:'include_selectors'] = opts[:'include_selectors'] if !opts[:'include_selectors'].nil? + query_params[:'exclude_selectors'] = opts[:'exclude_selectors'] if !opts[:'exclude_selectors'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"WebApi.web_scrape", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: WebApi#web_scrape\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + end +end diff --git a/lib/replynodes/generated/replynodes/api/youtube_api.rb b/lib/replynodes/generated/replynodes/api/youtube_api.rb new file mode 100644 index 0000000..a657d71 --- /dev/null +++ b/lib/replynodes/generated/replynodes/api/youtube_api.rb @@ -0,0 +1,476 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'cgi' + +module ReplyNodesGenerated + class YoutubeApi + attr_accessor :api_client + + def initialize(api_client = ApiClient.default) + @api_client = api_client + end + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :language + # @return [SuccessResponse] + def youtube_channel(id, opts = {}) + data, _status_code, _headers = youtube_channel_with_http_info(id, opts) + data + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :language + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def youtube_channel_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: YoutubeApi.youtube_channel ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling YoutubeApi.youtube_channel" + end + # resource path + local_var_path = '/v1/youtube/channel/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"YoutubeApi.youtube_channel", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: YoutubeApi#youtube_channel\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @return [SuccessResponse] + def youtube_comments(id, opts = {}) + data, _status_code, _headers = youtube_comments_with_http_info(id, opts) + data + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def youtube_comments_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: YoutubeApi.youtube_comments ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling YoutubeApi.youtube_comments" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 50 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling YoutubeApi.youtube_comments, must be smaller than or equal to 50.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling YoutubeApi.youtube_comments, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/youtube/comments/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"YoutubeApi.youtube_comments", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: YoutubeApi#youtube_comments\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :language + # @return [SuccessResponse] + def youtube_playlist(id, opts = {}) + data, _status_code, _headers = youtube_playlist_with_http_info(id, opts) + data + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :language + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def youtube_playlist_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: YoutubeApi.youtube_playlist ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling YoutubeApi.youtube_playlist" + end + # resource path + local_var_path = '/v1/youtube/playlist/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"YoutubeApi.youtube_playlist", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: YoutubeApi#youtube_playlist\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :language + # @return [SuccessResponse] + def youtube_related(id, opts = {}) + data, _status_code, _headers = youtube_related_with_http_info(id, opts) + data + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :language + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def youtube_related_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: YoutubeApi.youtube_related ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling YoutubeApi.youtube_related" + end + # resource path + local_var_path = '/v1/youtube/related/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"YoutubeApi.youtube_related", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: YoutubeApi#youtube_related\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param term [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :language + # @option opts [Integer] :limit + # @return [SuccessResponse] + def youtube_search(term, opts = {}) + data, _status_code, _headers = youtube_search_with_http_info(term, opts) + data + end + + # @param term [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :language + # @option opts [Integer] :limit + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def youtube_search_with_http_info(term, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: YoutubeApi.youtube_search ...' + end + # verify the required parameter 'term' is set + if @api_client.config.client_side_validation && term.nil? + fail ArgumentError, "Missing the required parameter 'term' when calling YoutubeApi.youtube_search" + end + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] > 50 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling YoutubeApi.youtube_search, must be smaller than or equal to 50.' + end + + if @api_client.config.client_side_validation && !opts[:'limit'].nil? && opts[:'limit'] < 1 + fail ArgumentError, 'invalid value for "opts[:"limit"]" when calling YoutubeApi.youtube_search, must be greater than or equal to 1.' + end + + # resource path + local_var_path = '/v1/youtube/search' + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'term'] = term + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + query_params[:'limit'] = opts[:'limit'] if !opts[:'limit'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"YoutubeApi.youtube_search", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: YoutubeApi#youtube_search\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :language + # @return [SuccessResponse] + def youtube_transcript(id, opts = {}) + data, _status_code, _headers = youtube_transcript_with_http_info(id, opts) + data + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :language + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def youtube_transcript_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: YoutubeApi.youtube_transcript ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling YoutubeApi.youtube_transcript" + end + # resource path + local_var_path = '/v1/youtube/transcript/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"YoutubeApi.youtube_transcript", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: YoutubeApi#youtube_transcript\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :language + # @return [SuccessResponse] + def youtube_video(id, opts = {}) + data, _status_code, _headers = youtube_video_with_http_info(id, opts) + data + end + + # @param id [String] + # @param [Hash] opts the optional parameters + # @option opts [String] :language + # @return [Array<(SuccessResponse, Integer, Hash)>] SuccessResponse data, response status code and response headers + def youtube_video_with_http_info(id, opts = {}) + if @api_client.config.debugging + @api_client.config.logger.debug 'Calling API: YoutubeApi.youtube_video ...' + end + # verify the required parameter 'id' is set + if @api_client.config.client_side_validation && id.nil? + fail ArgumentError, "Missing the required parameter 'id' when calling YoutubeApi.youtube_video" + end + # resource path + local_var_path = '/v1/youtube/video/{id}'.sub('{' + 'id' + '}', CGI.escape(id.to_s)) + + # query parameters + query_params = opts[:query_params] || {} + query_params[:'language'] = opts[:'language'] if !opts[:'language'].nil? + + # header parameters + header_params = opts[:header_params] || {} + # HTTP header 'Accept' (if needed) + header_params['Accept'] = @api_client.select_header_accept(['application/json']) unless header_params['Accept'] + + # form parameters + form_params = opts[:form_params] || {} + + # http body (model) + post_body = opts[:debug_body] + + # return_type + return_type = opts[:debug_return_type] || 'SuccessResponse' + + # auth_names + auth_names = opts[:debug_auth_names] || ['bearerAuth'] + + new_options = opts.merge( + :operation => :"YoutubeApi.youtube_video", + :header_params => header_params, + :query_params => query_params, + :form_params => form_params, + :body => post_body, + :auth_names => auth_names, + :return_type => return_type + ) + + data, status_code, headers = @api_client.call_api(:GET, local_var_path, new_options) + if @api_client.config.debugging + @api_client.config.logger.debug "API called: YoutubeApi#youtube_video\nData: #{data.inspect}\nStatus code: #{status_code}\nHeaders: #{headers}" + end + return data, status_code, headers + end + end +end diff --git a/lib/replynodes/generated/replynodes/api_client.rb b/lib/replynodes/generated/replynodes/api_client.rb new file mode 100644 index 0000000..fa6acf3 --- /dev/null +++ b/lib/replynodes/generated/replynodes/api_client.rb @@ -0,0 +1,437 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'json' +require 'logger' +require 'tempfile' +require 'time' +require 'faraday' +require 'faraday/multipart' if Gem::Version.new(Faraday::VERSION) >= Gem::Version.new('2.0') +require 'marcel' + + +module ReplyNodesGenerated + class ApiClient + # The Configuration object holding settings to be used in the API client. + attr_accessor :config + + # Defines the headers to be used in HTTP requests of all API calls by default. + # + # @return [Hash] + attr_accessor :default_headers + + # Initializes the ApiClient + # @option config [Configuration] Configuration for initializing the object, default to Configuration.default + def initialize(config = Configuration.default) + @config = config + @user_agent = "OpenAPI-Generator/#{VERSION}/ruby" + @default_headers = { + 'Content-Type' => 'application/json', + 'User-Agent' => @user_agent + } + end + + def self.default + @@default ||= ApiClient.new + end + + # Call an API with given options. + # + # @return [Array<(Object, Integer, Hash)>] an array of 3 elements: + # the data deserialized from response body (could be nil), response status code and response headers. + def call_api(http_method, path, opts = {}) + stream = nil + begin + response = connection(opts).public_send(http_method.to_sym.downcase) do |req| + request = build_request(http_method, path, req, opts) + stream = download_file(request) if opts[:return_type] == 'File' || opts[:return_type] == 'Binary' + end + + if config.debugging + config.logger.debug "HTTP response body ~BEGIN~\n#{response.body}\n~END~\n" + end + + unless response.success? + if response.status == 0 && response.respond_to?(:return_message) + # Errors from libcurl will be made visible here + fail ApiError.new(code: 0, + message: response.return_message) + else + fail ApiError.new(code: response.status, + response_headers: response.headers, + response_body: response.body), + response.reason_phrase + end + end + rescue Faraday::TimeoutError + fail ApiError.new('Connection timed out') + rescue Faraday::ConnectionFailed + fail ApiError.new('Connection failed') + end + + if opts[:return_type] == 'File' || opts[:return_type] == 'Binary' + data = deserialize_file(response, stream) + elsif opts[:return_type] + data = deserialize(response, opts[:return_type]) + else + data = nil + end + return data, response.status, response.headers + end + + # Builds the HTTP request + # + # @param [String] http_method HTTP method/verb (e.g. POST) + # @param [String] path URL path (e.g. /account/new) + # @option opts [Hash] :header_params Header parameters + # @option opts [Hash] :query_params Query parameters + # @option opts [Hash] :form_params Query parameters + # @option opts [Object] :body HTTP body (JSON/XML) + # @return [Faraday::Request] A Faraday Request + def build_request(http_method, path, request, opts = {}) + url = build_request_url(path, opts) + http_method = http_method.to_sym.downcase + + header_params = @default_headers.merge(opts[:header_params] || {}) + query_params = opts[:query_params] || {} + form_params = opts[:form_params] || {} + + update_params_for_auth! header_params, query_params, opts[:auth_names] + + if [:post, :patch, :put, :delete].include?(http_method) + req_body = build_request_body(header_params, form_params, opts[:body]) + if config.debugging + config.logger.debug "HTTP request body param ~BEGIN~\n#{req_body}\n~END~\n" + end + end + request.headers = header_params + request.body = req_body + + # Overload default options only if provided + request.options.params_encoder = config.params_encoder if config.params_encoder + request.options.timeout = config.timeout if config.timeout + + request.url url + request.params = query_params + request + end + + # Builds the HTTP request body + # + # @param [Hash] header_params Header parameters + # @param [Hash] form_params Query parameters + # @param [Object] body HTTP body (JSON/XML) + # @return [String] HTTP body data in the form of string + def build_request_body(header_params, form_params, body) + # http form + if header_params['Content-Type'] == 'application/x-www-form-urlencoded' + data = URI.encode_www_form(form_params) + elsif header_params['Content-Type'] == 'multipart/form-data' + data = {} + form_params.each do |key, value| + case value + when ::File, ::Tempfile + data[key] = Faraday::FilePart.new(value.path, Marcel::MimeType.for(Pathname.new(value.path))) + when ::Array, nil + # let Faraday handle Array and nil parameters + data[key] = value + else + data[key] = value.to_s + end + end + elsif body + data = body.is_a?(String) ? body : body.to_json + else + data = nil + end + data + end + + def download_file(request) + stream = [] + + # handle streaming Responses + request.options.on_data = Proc.new do |chunk, overall_received_bytes| + stream << chunk + end + + stream + end + + def deserialize_file(response, stream) + body = response.body + encoding = body.encoding + + # reconstruct content + content = stream.join + content = content.unpack('m').join if response.headers['Content-Transfer-Encoding'] == 'binary' + content = content.force_encoding(encoding) + + # return byte stream + return content if @config.return_binary_data == true + + # return file instead of binary data + content_disposition = response.headers['Content-Disposition'] + if content_disposition && content_disposition =~ /filename=/i + filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1] + prefix = sanitize_filename(filename) + else + prefix = 'download-' + end + prefix = prefix + '-' unless prefix.end_with?('-') + + tempfile = Tempfile.open(prefix, @config.temp_folder_path, encoding: encoding) + tempfile.write(content) + tempfile.close + + config.logger.info "Temp file written to #{tempfile.path}, please copy the file to a proper folder "\ + "with e.g. `FileUtils.cp(tempfile.path, '/new/file/path')` otherwise the temp file "\ + "will be deleted automatically with GC. It's also recommended to delete the temp file "\ + "explicitly with `tempfile.delete`" + tempfile + end + + def connection(opts) + opts[:header_params]['Content-Type'] == 'multipart/form-data' ? connection_multipart : connection_regular + end + + def connection_multipart + @connection_multipart ||= build_connection do |conn| + conn.request :multipart + conn.request :url_encoded + end + end + + def connection_regular + @connection_regular ||= build_connection + end + + def build_connection + Faraday.new(url: config.base_url, ssl: ssl_options, proxy: config.proxy) do |conn| + basic_auth(conn) + config.configure_middleware(conn) + yield(conn) if block_given? + conn.adapter(Faraday.default_adapter) + config.configure_connection(conn) + end + end + + def ssl_options + { + ca_file: config.ssl_ca_file, + verify: config.ssl_verify, + verify_mode: config.ssl_verify_mode, + client_cert: config.ssl_client_cert, + client_key: config.ssl_client_key + } + end + + def basic_auth(conn) + if config.username && config.password + if Gem::Version.new(Faraday::VERSION) >= Gem::Version.new('2.0') + conn.request(:authorization, :basic, config.username, config.password) + else + conn.request(:basic_auth, config.username, config.password) + end + end + end + + # Check if the given MIME is a JSON MIME. + # JSON MIME examples: + # application/json + # application/json; charset=UTF8 + # APPLICATION/JSON + # */* + # @param [String] mime MIME + # @return [Boolean] True if the MIME is application/json + def json_mime?(mime) + (mime == '*/*') || !(mime =~ /^Application\/.*json(?!p)(;.*)?/i).nil? + end + + # Deserialize the response to the given return type. + # + # @param [Response] response HTTP response + # @param [String] return_type some examples: "User", "Array", "Hash" + def deserialize(response, return_type) + body = response.body + return nil if body.nil? || body.empty? + + # return response body directly for String return type + return body.to_s if return_type == 'String' + + # ensuring a default content type + content_type = response.headers['Content-Type'] || 'application/json' + + fail "Content-Type is not supported: #{content_type}" unless json_mime?(content_type) + + begin + data = JSON.parse("[#{body}]", :symbolize_names => true)[0] + rescue JSON::ParserError => e + if %w(String Date Time).include?(return_type) + data = body + else + raise e + end + end + + convert_to_type data, return_type + end + + # Convert data to the given return type. + # @param [Object] data Data to be converted + # @param [String] return_type Return type + # @return [Mixed] Data in a particular type + def convert_to_type(data, return_type) + return nil if data.nil? + case return_type + when 'String' + data.to_s + when 'Integer' + data.to_i + when 'Float' + data.to_f + when 'Boolean' + data == true + when 'Time' + # parse date time (expecting ISO 8601 format) + Time.parse data + when 'Date' + # parse date time (expecting ISO 8601 format) + Date.parse data + when 'Object' + # generic object (usually a Hash), return directly + data + when /\AArray<(.+)>\z/ + # e.g. Array + sub_type = $1 + data.map { |item| convert_to_type(item, sub_type) } + when /\AHash\\z/ + # e.g. Hash + sub_type = $1 + {}.tap do |hash| + data.each { |k, v| hash[k] = convert_to_type(v, sub_type) } + end + else + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(return_type) + klass.respond_to?(:openapi_one_of) ? klass.build(data) : klass.build_from_hash(data) + end + end + + # Sanitize filename by removing path. + # e.g. ../../sun.gif becomes sun.gif + # + # @param [String] filename the filename to be sanitized + # @return [String] the sanitized filename + def sanitize_filename(filename) + filename.split(/[\/\\]/).last + end + + def build_request_url(path, opts = {}) + # Add leading and trailing slashes to path + path = "/#{path}".gsub(/\/+/, '/') + @config.base_url(opts[:operation]) + path + end + + # Update header and query params based on authentication settings. + # + # @param [Hash] header_params Header parameters + # @param [Hash] query_params Query parameters + # @param [String] auth_names Authentication scheme name + def update_params_for_auth!(header_params, query_params, auth_names) + Array(auth_names).each do |auth_name| + auth_setting = @config.auth_settings[auth_name] + next unless auth_setting + case auth_setting[:in] + when 'header' then header_params[auth_setting[:key]] = auth_setting[:value] + when 'query' then query_params[auth_setting[:key]] = auth_setting[:value] + else fail ArgumentError, 'Authentication token must be in `query` or `header`' + end + end + end + + # Sets user agent in HTTP header + # + # @param [String] user_agent User agent (e.g. openapi-generator/ruby/1.0.0) + def user_agent=(user_agent) + @user_agent = user_agent + @default_headers['User-Agent'] = @user_agent + end + + # Return Accept header based on an array of accepts provided. + # @param [Array] accepts array for Accept + # @return [String] the Accept header (e.g. application/json) + def select_header_accept(accepts) + return nil if accepts.nil? || accepts.empty? + # use JSON when present, otherwise use all of the provided + json_accept = accepts.find { |s| json_mime?(s) } + json_accept || accepts.join(',') + end + + # Return Content-Type header based on an array of content types provided. + # @param [Array] content_types array for Content-Type + # @return [String] the Content-Type header (e.g. application/json) + def select_header_content_type(content_types) + # return nil by default + return if content_types.nil? || content_types.empty? + # use JSON when present, otherwise use the first one + json_content_type = content_types.find { |s| json_mime?(s) } + json_content_type || content_types.first + end + + # Convert object (array, hash, object, etc) to JSON string. + # @param [Object] model object to be converted into JSON string + # @return [String] JSON string representation of the object + def object_to_http_body(model) + return model if model.nil? || model.is_a?(String) + local_body = nil + if model.is_a?(Array) + local_body = model.map { |m| object_to_hash(m) } + else + local_body = object_to_hash(model) + end + local_body.to_json + end + + # Convert object(non-array) to hash. + # @param [Object] obj object to be converted into JSON string + # @return [String] JSON string representation of the object + def object_to_hash(obj) + if obj.respond_to?(:to_hash) + obj.to_hash + else + obj + end + end + + # Build parameter value according to the given collection format. + # @param [String] collection_format one of :csv, :ssv, :tsv, :pipes and :multi + def build_collection_param(param, collection_format) + case collection_format + when :csv + param.join(',') + when :ssv + param.join(' ') + when :tsv + param.join("\t") + when :pipes + param.join('|') + when :multi + # return the array directly as typhoeus will handle it as expected + param + else + fail "unknown collection format: #{collection_format.inspect}" + end + end + end +end diff --git a/lib/replynodes/generated/replynodes/api_error.rb b/lib/replynodes/generated/replynodes/api_error.rb new file mode 100644 index 0000000..7712ab9 --- /dev/null +++ b/lib/replynodes/generated/replynodes/api_error.rb @@ -0,0 +1,58 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +module ReplyNodesGenerated + class ApiError < StandardError + attr_reader :code, :response_headers, :response_body + + # Usage examples: + # ApiError.new + # ApiError.new("message") + # ApiError.new(:code => 500, :response_headers => {}, :response_body => "") + # ApiError.new(:code => 404, :message => "Not Found") + def initialize(arg = nil) + if arg.is_a? Hash + if arg.key?(:message) || arg.key?('message') + super(arg[:message] || arg['message']) + else + super arg + end + + arg.each do |k, v| + instance_variable_set "@#{k}", v + end + else + super arg + @message = arg + end + end + + # Override to_s to display a friendly error message + def to_s + message + end + + def message + if @message.nil? + msg = "Error message: the server returns an error" + else + msg = @message + end + + msg += "\nHTTP status code: #{code}" if code + msg += "\nResponse headers: #{response_headers}" if response_headers + msg += "\nResponse body: #{response_body}" if response_body + + msg + end + end +end diff --git a/lib/replynodes/generated/replynodes/configuration.rb b/lib/replynodes/generated/replynodes/configuration.rb new file mode 100644 index 0000000..662c57c --- /dev/null +++ b/lib/replynodes/generated/replynodes/configuration.rb @@ -0,0 +1,393 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +module ReplyNodesGenerated + class Configuration + # Defines url scheme + attr_accessor :scheme + + # Defines url host + attr_accessor :host + + # Defines url base path + attr_accessor :base_path + + # Define server configuration index + attr_accessor :server_index + + # Define server operation configuration index + attr_accessor :server_operation_index + + # Default server variables + attr_accessor :server_variables + + # Default server operation variables + attr_accessor :server_operation_variables + + # Defines API keys used with API Key authentications. + # + # @return [Hash] key: parameter name, value: parameter value (API key) + # + # @example parameter name is "api_key", API key is "xxx" (e.g. "api_key=xxx" in query string) + # config.api_key['api_key'] = 'xxx' + attr_accessor :api_key + + # Defines API key prefixes used with API Key authentications. + # + # @return [Hash] key: parameter name, value: API key prefix + # + # @example parameter name is "Authorization", API key prefix is "Token" (e.g. "Authorization: Token xxx" in headers) + # config.api_key_prefix['api_key'] = 'Token' + attr_accessor :api_key_prefix + + # Defines the username used with HTTP basic authentication. + # + # @return [String] + attr_accessor :username + + # Defines the password used with HTTP basic authentication. + # + # @return [String] + attr_accessor :password + + # Defines the access token (Bearer) used with OAuth2. + attr_accessor :access_token + + # Defines a Proc used to fetch or refresh access tokens (Bearer) used with OAuth2. + # Overrides the access_token if set + # @return [Proc] + attr_accessor :access_token_getter + + # Set this to return data as binary instead of downloading a temp file. When enabled (set to true) + # HTTP responses with return type `File` will be returned as a stream of binary data. + # Default to false. + attr_accessor :return_binary_data + + # Set this to enable/disable debugging. When enabled (set to true), HTTP request/response + # details will be logged with `logger.debug` (see the `logger` attribute). + # Default to false. + # + # @return [true, false] + attr_accessor :debugging + + # Set this to ignore operation servers for the API client. This is useful when you need to + # send requests to a different server than the one specified in the OpenAPI document. + # Will default to the base url defined in the spec but can be overridden by setting + # `scheme`, `host`, `base_path` directly. + # Default to false. + # @return [true, false] + attr_accessor :ignore_operation_servers + + # Defines the logger used for debugging. + # Default to `Rails.logger` (when in Rails) or logging to STDOUT. + # + # @return [#debug] + attr_accessor :logger + + # Defines the temporary folder to store downloaded files + # (for API endpoints that have file response). + # Default to use `Tempfile`. + # + # @return [String] + attr_accessor :temp_folder_path + + # The time limit for HTTP request in seconds. + # Default to 0 (never times out). + attr_accessor :timeout + + # Set this to false to skip client side validation in the operation. + # Default to true. + # @return [true, false] + attr_accessor :client_side_validation + + ### TLS/SSL setting + # Set this to false to skip verifying SSL certificate when calling API from https server. + # Default to true. + # + # @note Do NOT set it to false in production code, otherwise you would face multiple types of cryptographic attacks. + # + # @return [true, false] + attr_accessor :ssl_verify + + ### TLS/SSL setting + # Any `OpenSSL::SSL::` constant (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL.html) + # + # @note Do NOT set it to false in production code, otherwise you would face multiple types of cryptographic attacks. + # + attr_accessor :ssl_verify_mode + + ### TLS/SSL setting + # Set this to customize the certificate file to verify the peer. + # + # @return [String] the path to the certificate file + attr_accessor :ssl_ca_file + + ### TLS/SSL setting + # Client certificate file (for client certificate) + attr_accessor :ssl_client_cert + + ### TLS/SSL setting + # Client private key file (for client certificate) + attr_accessor :ssl_client_key + + ### Proxy setting + # HTTP Proxy settings + attr_accessor :proxy + + # Set this to customize parameters encoder of array parameter. + # Default to nil. Faraday uses NestedParamsEncoder when nil. + # + # @see The params_encoder option of Faraday. Related source code: + # https://github.com/lostisland/faraday/tree/main/lib/faraday/encoders + attr_accessor :params_encoder + + + attr_accessor :inject_format + + attr_accessor :force_ending_format + + def initialize + @scheme = 'https' + @host = 'api.replynodes.com' + @base_path = '' + @server_index = nil + @server_operation_index = {} + @server_variables = {} + @server_operation_variables = {} + @api_key = {} + @api_key_prefix = {} + @client_side_validation = true + @ssl_verify = true + @ssl_verify_mode = nil + @ssl_ca_file = nil + @ssl_client_cert = nil + @ssl_client_key = nil + @middlewares = Hash.new { |h, k| h[k] = [] } + @configure_connection_blocks = [] + @timeout = 60 + # return data as binary instead of file + @return_binary_data = false + @params_encoder = nil + @debugging = false + @ignore_operation_servers = false + @inject_format = false + @force_ending_format = false + @logger = defined?(Rails) ? Rails.logger : Logger.new(STDOUT) + + yield(self) if block_given? + end + + # The default Configuration object. + def self.default + @@default ||= Configuration.new + end + + def configure + yield(self) if block_given? + end + + def scheme=(scheme) + # remove :// from scheme + @scheme = scheme.sub(/:\/\//, '') + end + + def host=(host) + # remove http(s):// and anything after a slash + @host = host.sub(/https?:\/\//, '').split('/').first + end + + def base_path=(base_path) + # Add leading and trailing slashes to base_path + @base_path = "/#{base_path}".gsub(/\/+/, '/') + @base_path = '' if @base_path == '/' + end + + # Returns base URL for specified operation based on server settings + def base_url(operation = nil) + return "#{scheme}://#{[host, base_path].join('/').gsub(/\/+/, '/')}".sub(/\/+\z/, '') if ignore_operation_servers + if operation_server_settings.key?(operation) then + index = server_operation_index.fetch(operation, server_index) + server_url(index.nil? ? 0 : index, server_operation_variables.fetch(operation, server_variables), operation_server_settings[operation]) + else + server_index.nil? ? "#{scheme}://#{[host, base_path].join('/').gsub(/\/+/, '/')}".sub(/\/+\z/, '') : server_url(server_index, server_variables, nil) + end + end + + # Gets API key (with prefix if set). + # @param [String] param_name the parameter name of API key auth + def api_key_with_prefix(param_name, param_alias = nil) + key = @api_key[param_name] + key = @api_key.fetch(param_alias, key) unless param_alias.nil? + if @api_key_prefix[param_name] + "#{@api_key_prefix[param_name]} #{key}" + else + key + end + end + + # Gets access_token using access_token_getter or uses the static access_token + def access_token_with_refresh + return access_token if access_token_getter.nil? + access_token_getter.call + end + + # Gets Basic Auth token string + def basic_auth_token + 'Basic ' + ["#{username}:#{password}"].pack('m').delete("\r\n") + end + + # Returns Auth Settings hash for api client. + def auth_settings + { + 'bearerAuth' => + { + type: 'bearer', + in: 'header', + format: 'rn_test_<64hex> or rn_live_<64hex>', + key: 'Authorization', + value: "Bearer #{access_token_with_refresh}" + }, + } + end + + # Returns an array of Server setting + def server_settings + [ + { + url: "https://api.replynodes.com", + description: "ReplyNodes production gateway", + } + ] + end + + def operation_server_settings + { + } + end + + # Returns URL based on server settings + # + # @param index array index of the server settings + # @param variables hash of variable and the corresponding value + def server_url(index, variables = {}, servers = nil) + servers = server_settings if servers == nil + + # check array index out of bound + if (index.nil? || index < 0 || index >= servers.size) + fail ArgumentError, "Invalid index #{index} when selecting the server. Must not be nil and must be less than #{servers.size}" + end + + server = servers[index] + url = server[:url] + + return url unless server.key? :variables + + # go through variable and assign a value + server[:variables].each do |name, variable| + if variables.key?(name) + if (!server[:variables][name].key?(:enum_values) || server[:variables][name][:enum_values].include?(variables[name])) + url.gsub! "{" + name.to_s + "}", variables[name] + else + fail ArgumentError, "The variable `#{name}` in the server URL has invalid value #{variables[name]}. Must be #{server[:variables][name][:enum_values]}." + end + else + # use default value + url.gsub! "{" + name.to_s + "}", server[:variables][name][:default_value] + end + end + + url + end + + # Configure Faraday connection directly. + # + # ``` + # c.configure_faraday_connection do |conn| + # conn.use Faraday::HttpCache, shared_cache: false, logger: logger + # conn.response :logger, nil, headers: true, bodies: true, log_level: :debug do |logger| + # logger.filter(/(Authorization: )(.*)/, '\1[REDACTED]') + # end + # end + # + # c.configure_faraday_connection do |conn| + # conn.adapter :typhoeus + # end + # ``` + # + # @param block [Proc] `#call`able object that takes one arg, the connection + def configure_faraday_connection(&block) + @configure_connection_blocks << block + end + + def configure_connection(conn) + @configure_connection_blocks.each do |block| + block.call(conn) + end + end + + # Adds middleware to the stack + def use(*middleware) + set_faraday_middleware(:use, *middleware) + end + + # Adds request middleware to the stack + def request(*middleware) + set_faraday_middleware(:request, *middleware) + end + + # Adds response middleware to the stack + def response(*middleware) + set_faraday_middleware(:response, *middleware) + end + + # Adds Faraday middleware setting information to the stack + # + # @example Use the `set_faraday_middleware` method to set middleware information + # config.set_faraday_middleware(:request, :retry, max: 3, methods: [:get, :post], retry_statuses: [503]) + # config.set_faraday_middleware(:response, :logger, nil, { bodies: true, log_level: :debug }) + # config.set_faraday_middleware(:use, Faraday::HttpCache, store: Rails.cache, shared_cache: false) + # config.set_faraday_middleware(:insert, 0, FaradayMiddleware::FollowRedirects, { standards_compliant: true, limit: 1 }) + # config.set_faraday_middleware(:swap, 0, Faraday::Response::Logger) + # config.set_faraday_middleware(:delete, Faraday::Multipart::Middleware) + # + # @see https://github.com/lostisland/faraday/blob/v2.3.0/lib/faraday/rack_builder.rb#L92-L143 + def set_faraday_middleware(operation, key, *args, &block) + unless [:request, :response, :use, :insert, :insert_before, :insert_after, :swap, :delete].include?(operation) + fail ArgumentError, "Invalid faraday middleware operation #{operation}. Must be" \ + " :request, :response, :use, :insert, :insert_before, :insert_after, :swap or :delete." + end + + @middlewares[operation] << [key, args, block] + end + ruby2_keywords(:set_faraday_middleware) if respond_to?(:ruby2_keywords, true) + + # Set up middleware on the connection + def configure_middleware(connection) + return if @middlewares.empty? + + [:request, :response, :use, :insert, :insert_before, :insert_after, :swap].each do |operation| + next unless @middlewares.key?(operation) + + @middlewares[operation].each do |key, args, block| + connection.builder.send(operation, key, *args, &block) + end + end + + if @middlewares.key?(:delete) + @middlewares[:delete].each do |key, _args, _block| + connection.builder.delete(key) + end + end + end + + end +end diff --git a/lib/replynodes/generated/replynodes/models/brand_fonts_data.rb b/lib/replynodes/generated/replynodes/models/brand_fonts_data.rb new file mode 100644 index 0000000..9f87c74 --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/brand_fonts_data.rb @@ -0,0 +1,312 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class BrandFontsData + attr_accessor :domain + + attr_accessor :url + + attr_accessor :count + + # Word count reported by the rendered page metadata, when available. + attr_accessor :words_count + + attr_accessor :fonts + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'domain' => :'domain', + :'url' => :'url', + :'count' => :'count', + :'words_count' => :'words_count', + :'fonts' => :'fonts' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'domain' => :'String', + :'url' => :'String', + :'count' => :'Integer', + :'words_count' => :'Integer', + :'fonts' => :'Array>' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::BrandFontsData` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::BrandFontsData`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'domain') + self.domain = attributes[:'domain'] + else + self.domain = nil + end + + if attributes.key?(:'url') + self.url = attributes[:'url'] + else + self.url = nil + end + + if attributes.key?(:'count') + self.count = attributes[:'count'] + else + self.count = nil + end + + if attributes.key?(:'words_count') + self.words_count = attributes[:'words_count'] + end + + if attributes.key?(:'fonts') + if (value = attributes[:'fonts']).is_a?(Array) + self.fonts = value + end + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @domain.nil? + invalid_properties.push('invalid value for "domain", domain cannot be nil.') + end + + if @url.nil? + invalid_properties.push('invalid value for "url", url cannot be nil.') + end + + if @count.nil? + invalid_properties.push('invalid value for "count", count cannot be nil.') + end + + if @count < 0 + invalid_properties.push('invalid value for "count", must be greater than or equal to 0.') + end + + if !@words_count.nil? && @words_count < 0 + invalid_properties.push('invalid value for "words_count", must be greater than or equal to 0.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @domain.nil? + return false if @url.nil? + return false if @count.nil? + return false if @count < 0 + return false if !@words_count.nil? && @words_count < 0 + true + end + + # Custom attribute writer method with validation + # @param [Object] count Value to be assigned + def count=(count) + if count.nil? + fail ArgumentError, 'count cannot be nil' + end + + if count < 0 + fail ArgumentError, 'invalid value for "count", must be greater than or equal to 0.' + end + + @count = count + end + + # Custom attribute writer method with validation + # @param [Object] words_count Value to be assigned + def words_count=(words_count) + if words_count.nil? + fail ArgumentError, 'words_count cannot be nil' + end + + if words_count < 0 + fail ArgumentError, 'invalid value for "words_count", must be greater than or equal to 0.' + end + + @words_count = words_count + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + domain == o.domain && + url == o.url && + count == o.count && + words_count == o.words_count && + fonts == o.fonts + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [domain, url, count, words_count, fonts].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/brand_fonts_response.rb b/lib/replynodes/generated/replynodes/models/brand_fonts_response.rb new file mode 100644 index 0000000..4529f4f --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/brand_fonts_response.rb @@ -0,0 +1,237 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class BrandFontsResponse + attr_accessor :data + + attr_accessor :meta + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'data' => :'data', + :'meta' => :'meta' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'data' => :'BrandFontsData', + :'meta' => :'ResponseMeta' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::BrandFontsResponse` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::BrandFontsResponse`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'data') + self.data = attributes[:'data'] + else + self.data = nil + end + + if attributes.key?(:'meta') + self.meta = attributes[:'meta'] + else + self.meta = nil + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @data.nil? + invalid_properties.push('invalid value for "data", data cannot be nil.') + end + + if @meta.nil? + invalid_properties.push('invalid value for "meta", meta cannot be nil.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @data.nil? + return false if @meta.nil? + true + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + data == o.data && + meta == o.meta + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [data, meta].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/credit_topup_required.rb b/lib/replynodes/generated/replynodes/models/credit_topup_required.rb new file mode 100644 index 0000000..59b8c90 --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/credit_topup_required.rb @@ -0,0 +1,315 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class CreditTopupRequired + attr_accessor :code + + attr_accessor :balance_micro + + attr_accessor :price_micro + + attr_accessor :topup_url + + class EnumAttributeValidator + attr_reader :datatype + attr_reader :allowable_values + + def initialize(datatype, allowable_values) + @allowable_values = allowable_values.map do |value| + case datatype.to_s + when /Integer/i + value.to_i + when /Float/i + value.to_f + else + value + end + end + end + + def valid?(value) + !value || allowable_values.include?(value) + end + end + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'code' => :'code', + :'balance_micro' => :'balance_micro', + :'price_micro' => :'price_micro', + :'topup_url' => :'topup_url' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'code' => :'String', + :'balance_micro' => :'Integer', + :'price_micro' => :'Integer', + :'topup_url' => :'String' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::CreditTopupRequired` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::CreditTopupRequired`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'code') + self.code = attributes[:'code'] + else + self.code = nil + end + + if attributes.key?(:'balance_micro') + self.balance_micro = attributes[:'balance_micro'] + else + self.balance_micro = nil + end + + if attributes.key?(:'price_micro') + self.price_micro = attributes[:'price_micro'] + else + self.price_micro = nil + end + + if attributes.key?(:'topup_url') + self.topup_url = attributes[:'topup_url'] + else + self.topup_url = nil + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @code.nil? + invalid_properties.push('invalid value for "code", code cannot be nil.') + end + + if @balance_micro.nil? + invalid_properties.push('invalid value for "balance_micro", balance_micro cannot be nil.') + end + + if @price_micro.nil? + invalid_properties.push('invalid value for "price_micro", price_micro cannot be nil.') + end + + if @topup_url.nil? + invalid_properties.push('invalid value for "topup_url", topup_url cannot be nil.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @code.nil? + code_validator = EnumAttributeValidator.new('String', ["topup_required"]) + return false unless code_validator.valid?(@code) + return false if @balance_micro.nil? + return false if @price_micro.nil? + return false if @topup_url.nil? + topup_url_validator = EnumAttributeValidator.new('String', ["/v1/billing/topup/intents"]) + return false unless topup_url_validator.valid?(@topup_url) + true + end + + # Custom attribute writer method checking allowed values (enum). + # @param [Object] code Object to be assigned + def code=(code) + validator = EnumAttributeValidator.new('String', ["topup_required"]) + unless validator.valid?(code) + fail ArgumentError, "invalid value for \"code\", must be one of #{validator.allowable_values}." + end + @code = code + end + + # Custom attribute writer method checking allowed values (enum). + # @param [Object] topup_url Object to be assigned + def topup_url=(topup_url) + validator = EnumAttributeValidator.new('String', ["/v1/billing/topup/intents"]) + unless validator.valid?(topup_url) + fail ArgumentError, "invalid value for \"topup_url\", must be one of #{validator.allowable_values}." + end + @topup_url = topup_url + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + code == o.code && + balance_micro == o.balance_micro && + price_micro == o.price_micro && + topup_url == o.topup_url + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [code, balance_micro, price_micro, topup_url].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/error_detail.rb b/lib/replynodes/generated/replynodes/models/error_detail.rb new file mode 100644 index 0000000..2b9cdcd --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/error_detail.rb @@ -0,0 +1,253 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class ErrorDetail + attr_accessor :code + + attr_accessor :message + + attr_accessor :request_id + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'code' => :'code', + :'message' => :'message', + :'request_id' => :'request_id' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'code' => :'String', + :'message' => :'String', + :'request_id' => :'String' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::ErrorDetail` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::ErrorDetail`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'code') + self.code = attributes[:'code'] + else + self.code = nil + end + + if attributes.key?(:'message') + self.message = attributes[:'message'] + else + self.message = nil + end + + if attributes.key?(:'request_id') + self.request_id = attributes[:'request_id'] + else + self.request_id = nil + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @code.nil? + invalid_properties.push('invalid value for "code", code cannot be nil.') + end + + if @message.nil? + invalid_properties.push('invalid value for "message", message cannot be nil.') + end + + if @request_id.nil? + invalid_properties.push('invalid value for "request_id", request_id cannot be nil.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @code.nil? + return false if @message.nil? + return false if @request_id.nil? + true + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + code == o.code && + message == o.message && + request_id == o.request_id + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [code, message, request_id].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/error_response.rb b/lib/replynodes/generated/replynodes/models/error_response.rb new file mode 100644 index 0000000..94cd0dc --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/error_response.rb @@ -0,0 +1,221 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class ErrorResponse + attr_accessor :error + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'error' => :'error' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'error' => :'ErrorDetail' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::ErrorResponse` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::ErrorResponse`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'error') + self.error = attributes[:'error'] + else + self.error = nil + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @error.nil? + invalid_properties.push('invalid value for "error", error cannot be nil.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @error.nil? + true + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + error == o.error + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [error].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/pagination.rb b/lib/replynodes/generated/replynodes/models/pagination.rb new file mode 100644 index 0000000..6ad6358 --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/pagination.rb @@ -0,0 +1,241 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class Pagination + attr_accessor :next_cursor + + attr_accessor :has_more + + attr_accessor :page + + attr_accessor :limit + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'next_cursor' => :'next_cursor', + :'has_more' => :'has_more', + :'page' => :'page', + :'limit' => :'limit' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'next_cursor' => :'String', + :'has_more' => :'Boolean', + :'page' => :'Integer', + :'limit' => :'Integer' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::Pagination` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::Pagination`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'next_cursor') + self.next_cursor = attributes[:'next_cursor'] + end + + if attributes.key?(:'has_more') + self.has_more = attributes[:'has_more'] + end + + if attributes.key?(:'page') + self.page = attributes[:'page'] + end + + if attributes.key?(:'limit') + self.limit = attributes[:'limit'] + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + true + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + next_cursor == o.next_cursor && + has_more == o.has_more && + page == o.page && + limit == o.limit + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [next_cursor, has_more, page, limit].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/payment_required.rb b/lib/replynodes/generated/replynodes/models/payment_required.rb new file mode 100644 index 0000000..2812247 --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/payment_required.rb @@ -0,0 +1,340 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class PaymentRequired + attr_accessor :x402_version + + attr_accessor :error + + attr_accessor :resource + + attr_accessor :accepts + + attr_accessor :extensions + + class EnumAttributeValidator + attr_reader :datatype + attr_reader :allowable_values + + def initialize(datatype, allowable_values) + @allowable_values = allowable_values.map do |value| + case datatype.to_s + when /Integer/i + value.to_i + when /Float/i + value.to_f + else + value + end + end + end + + def valid?(value) + !value || allowable_values.include?(value) + end + end + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'x402_version' => :'x402Version', + :'error' => :'error', + :'resource' => :'resource', + :'accepts' => :'accepts', + :'extensions' => :'extensions' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'x402_version' => :'Integer', + :'error' => :'String', + :'resource' => :'PaymentRequiredResource', + :'accepts' => :'Array', + :'extensions' => :'PaymentRequiredExtensions' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::PaymentRequired` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::PaymentRequired`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'x402_version') + self.x402_version = attributes[:'x402_version'] + else + self.x402_version = nil + end + + if attributes.key?(:'error') + self.error = attributes[:'error'] + else + self.error = nil + end + + if attributes.key?(:'resource') + self.resource = attributes[:'resource'] + else + self.resource = nil + end + + if attributes.key?(:'accepts') + if (value = attributes[:'accepts']).is_a?(Array) + self.accepts = value + end + else + self.accepts = nil + end + + if attributes.key?(:'extensions') + self.extensions = attributes[:'extensions'] + else + self.extensions = nil + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @x402_version.nil? + invalid_properties.push('invalid value for "x402_version", x402_version cannot be nil.') + end + + if @error.nil? + invalid_properties.push('invalid value for "error", error cannot be nil.') + end + + if @resource.nil? + invalid_properties.push('invalid value for "resource", resource cannot be nil.') + end + + if @accepts.nil? + invalid_properties.push('invalid value for "accepts", accepts cannot be nil.') + end + + if @accepts.length < 1 + invalid_properties.push('invalid value for "accepts", number of items must be greater than or equal to 1.') + end + + if @extensions.nil? + invalid_properties.push('invalid value for "extensions", extensions cannot be nil.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @x402_version.nil? + x402_version_validator = EnumAttributeValidator.new('Integer', [2]) + return false unless x402_version_validator.valid?(@x402_version) + return false if @error.nil? + return false if @resource.nil? + return false if @accepts.nil? + return false if @accepts.length < 1 + return false if @extensions.nil? + true + end + + # Custom attribute writer method checking allowed values (enum). + # @param [Object] x402_version Object to be assigned + def x402_version=(x402_version) + validator = EnumAttributeValidator.new('Integer', [2]) + unless validator.valid?(x402_version) + fail ArgumentError, "invalid value for \"x402_version\", must be one of #{validator.allowable_values}." + end + @x402_version = x402_version + end + + # Custom attribute writer method with validation + # @param [Object] accepts Value to be assigned + def accepts=(accepts) + if accepts.nil? + fail ArgumentError, 'accepts cannot be nil' + end + + if accepts.length < 1 + fail ArgumentError, 'invalid value for "accepts", number of items must be greater than or equal to 1.' + end + + @accepts = accepts + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + x402_version == o.x402_version && + error == o.error && + resource == o.resource && + accepts == o.accepts && + extensions == o.extensions + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [x402_version, error, resource, accepts, extensions].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/payment_required_accountless_extensions.rb b/lib/replynodes/generated/replynodes/models/payment_required_accountless_extensions.rb new file mode 100644 index 0000000..6065112 --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/payment_required_accountless_extensions.rb @@ -0,0 +1,221 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class PaymentRequiredAccountlessExtensions + attr_accessor :x_replynodes_accountless + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'x_replynodes_accountless' => :'x-replynodes-accountless' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'x_replynodes_accountless' => :'PaymentRequiredAccountlessExtensionsXReplynodesAccountless' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::PaymentRequiredAccountlessExtensions` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::PaymentRequiredAccountlessExtensions`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'x_replynodes_accountless') + self.x_replynodes_accountless = attributes[:'x_replynodes_accountless'] + else + self.x_replynodes_accountless = nil + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @x_replynodes_accountless.nil? + invalid_properties.push('invalid value for "x_replynodes_accountless", x_replynodes_accountless cannot be nil.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @x_replynodes_accountless.nil? + true + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + x_replynodes_accountless == o.x_replynodes_accountless + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [x_replynodes_accountless].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/payment_required_accountless_extensions_x_replynodes_accountless.rb b/lib/replynodes/generated/replynodes/models/payment_required_accountless_extensions_x_replynodes_accountless.rb new file mode 100644 index 0000000..e65facd --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/payment_required_accountless_extensions_x_replynodes_accountless.rb @@ -0,0 +1,287 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class PaymentRequiredAccountlessExtensionsXReplynodesAccountless + attr_accessor :payment_mode + + attr_accessor :bearer_supported + + attr_accessor :prepaid_supported + + class EnumAttributeValidator + attr_reader :datatype + attr_reader :allowable_values + + def initialize(datatype, allowable_values) + @allowable_values = allowable_values.map do |value| + case datatype.to_s + when /Integer/i + value.to_i + when /Float/i + value.to_f + else + value + end + end + end + + def valid?(value) + !value || allowable_values.include?(value) + end + end + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'payment_mode' => :'payment_mode', + :'bearer_supported' => :'bearer_supported', + :'prepaid_supported' => :'prepaid_supported' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'payment_mode' => :'String', + :'bearer_supported' => :'Boolean', + :'prepaid_supported' => :'Boolean' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::PaymentRequiredAccountlessExtensionsXReplynodesAccountless` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::PaymentRequiredAccountlessExtensionsXReplynodesAccountless`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'payment_mode') + self.payment_mode = attributes[:'payment_mode'] + else + self.payment_mode = nil + end + + if attributes.key?(:'bearer_supported') + self.bearer_supported = attributes[:'bearer_supported'] + else + self.bearer_supported = nil + end + + if attributes.key?(:'prepaid_supported') + self.prepaid_supported = attributes[:'prepaid_supported'] + else + self.prepaid_supported = nil + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @payment_mode.nil? + invalid_properties.push('invalid value for "payment_mode", payment_mode cannot be nil.') + end + + if @bearer_supported.nil? + invalid_properties.push('invalid value for "bearer_supported", bearer_supported cannot be nil.') + end + + if @prepaid_supported.nil? + invalid_properties.push('invalid value for "prepaid_supported", prepaid_supported cannot be nil.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @payment_mode.nil? + payment_mode_validator = EnumAttributeValidator.new('String', ["x402_only"]) + return false unless payment_mode_validator.valid?(@payment_mode) + return false if @bearer_supported.nil? + return false if @prepaid_supported.nil? + true + end + + # Custom attribute writer method checking allowed values (enum). + # @param [Object] payment_mode Object to be assigned + def payment_mode=(payment_mode) + validator = EnumAttributeValidator.new('String', ["x402_only"]) + unless validator.valid?(payment_mode) + fail ArgumentError, "invalid value for \"payment_mode\", must be one of #{validator.allowable_values}." + end + @payment_mode = payment_mode + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + payment_mode == o.payment_mode && + bearer_supported == o.bearer_supported && + prepaid_supported == o.prepaid_supported + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [payment_mode, bearer_supported, prepaid_supported].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/payment_required_extensions.rb b/lib/replynodes/generated/replynodes/models/payment_required_extensions.rb new file mode 100644 index 0000000..f425167 --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/payment_required_extensions.rb @@ -0,0 +1,105 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + module PaymentRequiredExtensions + class << self + # List of class defined in oneOf (OpenAPI v3) + def openapi_one_of + [ + :'PaymentRequiredAccountlessExtensions', + :'PaymentRequiredPrepaidExtensions' + ] + end + + # Builds the object + # @param [Mixed] Data to be matched against the list of oneOf items + # @return [Object] Returns the model or the data itself + def build(data) + # Go through the list of oneOf items and attempt to identify the appropriate one. + # Note: + # - We do not attempt to check whether exactly one item matches. + # - No advanced validation of types in some cases (e.g. "x: { type: string }" will happily match { x: 123 }) + # due to the way the deserialization is made in the base_object template (it just casts without verifying). + # - TODO: scalar values are de facto behaving as if they were nullable. + # - TODO: logging when debugging is set. + openapi_one_of.each do |klass| + begin + next if klass == :AnyType # "nullable: true" + typed_data = find_and_cast_into_type(klass, data) + return typed_data if typed_data + rescue # rescue all errors so we keep iterating even if the current item lookup raises + end + end + + openapi_one_of.include?(:AnyType) ? data : nil + end + + private + + SchemaMismatchError = Class.new(StandardError) + + # Note: 'File' is missing here because in the regular case we get the data _after_ a call to JSON.parse. + def find_and_cast_into_type(klass, data) + return if data.nil? + + case klass.to_s + when 'Boolean' + return data if data.instance_of?(TrueClass) || data.instance_of?(FalseClass) + when 'Float' + return data if data.instance_of?(Float) + when 'Integer' + return data if data.instance_of?(Integer) + when 'Time' + return Time.parse(data) + when 'Date' + return Date.parse(data) + when 'String' + return data if data.instance_of?(String) + when 'Object' # "type: object" + return data if data.instance_of?(Hash) + when /\AArray<(?.+)>\z/ # "type: array" + if data.instance_of?(Array) + sub_type = Regexp.last_match[:sub_type] + return data.map { |item| find_and_cast_into_type(sub_type, item) } + end + when /\AHash.+)>\z/ # "type: object" with "additionalProperties: { ... }" + if data.instance_of?(Hash) && data.keys.all? { |k| k.instance_of?(Symbol) || k.instance_of?(String) } + sub_type = Regexp.last_match[:sub_type] + return data.each_with_object({}) { |(k, v), hsh| hsh[k] = find_and_cast_into_type(sub_type, v) } + end + else # model + const = ReplyNodesGenerated.const_get(klass) + if const + if const.respond_to?(:openapi_one_of) # nested oneOf model + model = const.build(data) + return model if model + else + # raise if data contains keys that are not known to the model + raise if const.respond_to?(:acceptable_attributes) && !(data.keys - const.acceptable_attributes).empty? + model = const.build_from_hash(data) + return model if model + end + end + end + + raise # if no match by now, raise + rescue + raise SchemaMismatchError, "#{data} doesn't match the #{klass} type" + end + end + end + +end diff --git a/lib/replynodes/generated/replynodes/models/payment_required_prepaid_extensions.rb b/lib/replynodes/generated/replynodes/models/payment_required_prepaid_extensions.rb new file mode 100644 index 0000000..288cd5a --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/payment_required_prepaid_extensions.rb @@ -0,0 +1,221 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class PaymentRequiredPrepaidExtensions + attr_accessor :topup + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'topup' => :'topup' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'topup' => :'PaymentRequiredPrepaidExtensionsTopup' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::PaymentRequiredPrepaidExtensions` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::PaymentRequiredPrepaidExtensions`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'topup') + self.topup = attributes[:'topup'] + else + self.topup = nil + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @topup.nil? + invalid_properties.push('invalid value for "topup", topup cannot be nil.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @topup.nil? + true + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + topup == o.topup + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [topup].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/payment_required_prepaid_extensions_topup.rb b/lib/replynodes/generated/replynodes/models/payment_required_prepaid_extensions_topup.rb new file mode 100644 index 0000000..210b5dd --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/payment_required_prepaid_extensions_topup.rb @@ -0,0 +1,255 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class PaymentRequiredPrepaidExtensionsTopup + attr_accessor :topup_url + + class EnumAttributeValidator + attr_reader :datatype + attr_reader :allowable_values + + def initialize(datatype, allowable_values) + @allowable_values = allowable_values.map do |value| + case datatype.to_s + when /Integer/i + value.to_i + when /Float/i + value.to_f + else + value + end + end + end + + def valid?(value) + !value || allowable_values.include?(value) + end + end + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'topup_url' => :'topup_url' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'topup_url' => :'String' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::PaymentRequiredPrepaidExtensionsTopup` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::PaymentRequiredPrepaidExtensionsTopup`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'topup_url') + self.topup_url = attributes[:'topup_url'] + else + self.topup_url = nil + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @topup_url.nil? + invalid_properties.push('invalid value for "topup_url", topup_url cannot be nil.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @topup_url.nil? + topup_url_validator = EnumAttributeValidator.new('String', ["/v1/billing/topup/intents"]) + return false unless topup_url_validator.valid?(@topup_url) + true + end + + # Custom attribute writer method checking allowed values (enum). + # @param [Object] topup_url Object to be assigned + def topup_url=(topup_url) + validator = EnumAttributeValidator.new('String', ["/v1/billing/topup/intents"]) + unless validator.valid?(topup_url) + fail ArgumentError, "invalid value for \"topup_url\", must be one of #{validator.allowable_values}." + end + @topup_url = topup_url + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + topup_url == o.topup_url + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [topup_url].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/payment_required_resource.rb b/lib/replynodes/generated/replynodes/models/payment_required_resource.rb new file mode 100644 index 0000000..f92259b --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/payment_required_resource.rb @@ -0,0 +1,237 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class PaymentRequiredResource + attr_accessor :url + + attr_accessor :mime_type + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'url' => :'url', + :'mime_type' => :'mimeType' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'url' => :'String', + :'mime_type' => :'String' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::PaymentRequiredResource` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::PaymentRequiredResource`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'url') + self.url = attributes[:'url'] + else + self.url = nil + end + + if attributes.key?(:'mime_type') + self.mime_type = attributes[:'mime_type'] + else + self.mime_type = nil + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @url.nil? + invalid_properties.push('invalid value for "url", url cannot be nil.') + end + + if @mime_type.nil? + invalid_properties.push('invalid value for "mime_type", mime_type cannot be nil.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @url.nil? + return false if @mime_type.nil? + true + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + url == o.url && + mime_type == o.mime_type + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [url, mime_type].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/payment_required_response.rb b/lib/replynodes/generated/replynodes/models/payment_required_response.rb new file mode 100644 index 0000000..b6dc99d --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/payment_required_response.rb @@ -0,0 +1,105 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + module PaymentRequiredResponse + class << self + # List of class defined in oneOf (OpenAPI v3) + def openapi_one_of + [ + :'CreditTopupRequired', + :'PaymentRequired' + ] + end + + # Builds the object + # @param [Mixed] Data to be matched against the list of oneOf items + # @return [Object] Returns the model or the data itself + def build(data) + # Go through the list of oneOf items and attempt to identify the appropriate one. + # Note: + # - We do not attempt to check whether exactly one item matches. + # - No advanced validation of types in some cases (e.g. "x: { type: string }" will happily match { x: 123 }) + # due to the way the deserialization is made in the base_object template (it just casts without verifying). + # - TODO: scalar values are de facto behaving as if they were nullable. + # - TODO: logging when debugging is set. + openapi_one_of.each do |klass| + begin + next if klass == :AnyType # "nullable: true" + typed_data = find_and_cast_into_type(klass, data) + return typed_data if typed_data + rescue # rescue all errors so we keep iterating even if the current item lookup raises + end + end + + openapi_one_of.include?(:AnyType) ? data : nil + end + + private + + SchemaMismatchError = Class.new(StandardError) + + # Note: 'File' is missing here because in the regular case we get the data _after_ a call to JSON.parse. + def find_and_cast_into_type(klass, data) + return if data.nil? + + case klass.to_s + when 'Boolean' + return data if data.instance_of?(TrueClass) || data.instance_of?(FalseClass) + when 'Float' + return data if data.instance_of?(Float) + when 'Integer' + return data if data.instance_of?(Integer) + when 'Time' + return Time.parse(data) + when 'Date' + return Date.parse(data) + when 'String' + return data if data.instance_of?(String) + when 'Object' # "type: object" + return data if data.instance_of?(Hash) + when /\AArray<(?.+)>\z/ # "type: array" + if data.instance_of?(Array) + sub_type = Regexp.last_match[:sub_type] + return data.map { |item| find_and_cast_into_type(sub_type, item) } + end + when /\AHash.+)>\z/ # "type: object" with "additionalProperties: { ... }" + if data.instance_of?(Hash) && data.keys.all? { |k| k.instance_of?(Symbol) || k.instance_of?(String) } + sub_type = Regexp.last_match[:sub_type] + return data.each_with_object({}) { |(k, v), hsh| hsh[k] = find_and_cast_into_type(sub_type, v) } + end + else # model + const = ReplyNodesGenerated.const_get(klass) + if const + if const.respond_to?(:openapi_one_of) # nested oneOf model + model = const.build(data) + return model if model + else + # raise if data contains keys that are not known to the model + raise if const.respond_to?(:acceptable_attributes) && !(data.keys - const.acceptable_attributes).empty? + model = const.build_from_hash(data) + return model if model + end + end + end + + raise # if no match by now, raise + rescue + raise SchemaMismatchError, "#{data} doesn't match the #{klass} type" + end + end + end + +end diff --git a/lib/replynodes/generated/replynodes/models/payment_requirements.rb b/lib/replynodes/generated/replynodes/models/payment_requirements.rb new file mode 100644 index 0000000..c2fd6b1 --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/payment_requirements.rb @@ -0,0 +1,312 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class PaymentRequirements + attr_accessor :scheme + + attr_accessor :network + + attr_accessor :asset + + attr_accessor :amount + + attr_accessor :pay_to + + attr_accessor :max_timeout_seconds + + attr_accessor :extra + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'scheme' => :'scheme', + :'network' => :'network', + :'asset' => :'asset', + :'amount' => :'amount', + :'pay_to' => :'payTo', + :'max_timeout_seconds' => :'maxTimeoutSeconds', + :'extra' => :'extra' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'scheme' => :'String', + :'network' => :'String', + :'asset' => :'String', + :'amount' => :'String', + :'pay_to' => :'String', + :'max_timeout_seconds' => :'Integer', + :'extra' => :'Hash' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::PaymentRequirements` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::PaymentRequirements`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'scheme') + self.scheme = attributes[:'scheme'] + else + self.scheme = nil + end + + if attributes.key?(:'network') + self.network = attributes[:'network'] + else + self.network = nil + end + + if attributes.key?(:'asset') + self.asset = attributes[:'asset'] + else + self.asset = nil + end + + if attributes.key?(:'amount') + self.amount = attributes[:'amount'] + else + self.amount = nil + end + + if attributes.key?(:'pay_to') + self.pay_to = attributes[:'pay_to'] + else + self.pay_to = nil + end + + if attributes.key?(:'max_timeout_seconds') + self.max_timeout_seconds = attributes[:'max_timeout_seconds'] + else + self.max_timeout_seconds = nil + end + + if attributes.key?(:'extra') + if (value = attributes[:'extra']).is_a?(Hash) + self.extra = value + end + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @scheme.nil? + invalid_properties.push('invalid value for "scheme", scheme cannot be nil.') + end + + if @network.nil? + invalid_properties.push('invalid value for "network", network cannot be nil.') + end + + if @asset.nil? + invalid_properties.push('invalid value for "asset", asset cannot be nil.') + end + + if @amount.nil? + invalid_properties.push('invalid value for "amount", amount cannot be nil.') + end + + if @pay_to.nil? + invalid_properties.push('invalid value for "pay_to", pay_to cannot be nil.') + end + + if @max_timeout_seconds.nil? + invalid_properties.push('invalid value for "max_timeout_seconds", max_timeout_seconds cannot be nil.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @scheme.nil? + return false if @network.nil? + return false if @asset.nil? + return false if @amount.nil? + return false if @pay_to.nil? + return false if @max_timeout_seconds.nil? + true + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + scheme == o.scheme && + network == o.network && + asset == o.asset && + amount == o.amount && + pay_to == o.pay_to && + max_timeout_seconds == o.max_timeout_seconds && + extra == o.extra + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [scheme, network, asset, amount, pay_to, max_timeout_seconds, extra].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/response_meta.rb b/lib/replynodes/generated/replynodes/models/response_meta.rb new file mode 100644 index 0000000..268bf7d --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/response_meta.rb @@ -0,0 +1,277 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class ResponseMeta + attr_accessor :request_id + + attr_accessor :contract_version + + attr_accessor :generated_at + + attr_accessor :availability + + attr_accessor :next_cursor + + attr_accessor :missing_fields + + attr_accessor :stale + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'request_id' => :'request_id', + :'contract_version' => :'contract_version', + :'generated_at' => :'generated_at', + :'availability' => :'availability', + :'next_cursor' => :'next_cursor', + :'missing_fields' => :'missing_fields', + :'stale' => :'stale' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'request_id' => :'String', + :'contract_version' => :'String', + :'generated_at' => :'Time', + :'availability' => :'String', + :'next_cursor' => :'String', + :'missing_fields' => :'Array', + :'stale' => :'Boolean' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::ResponseMeta` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::ResponseMeta`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'request_id') + self.request_id = attributes[:'request_id'] + else + self.request_id = nil + end + + if attributes.key?(:'contract_version') + self.contract_version = attributes[:'contract_version'] + end + + if attributes.key?(:'generated_at') + self.generated_at = attributes[:'generated_at'] + end + + if attributes.key?(:'availability') + self.availability = attributes[:'availability'] + end + + if attributes.key?(:'next_cursor') + self.next_cursor = attributes[:'next_cursor'] + end + + if attributes.key?(:'missing_fields') + if (value = attributes[:'missing_fields']).is_a?(Array) + self.missing_fields = value + end + end + + if attributes.key?(:'stale') + self.stale = attributes[:'stale'] + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @request_id.nil? + invalid_properties.push('invalid value for "request_id", request_id cannot be nil.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @request_id.nil? + true + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + request_id == o.request_id && + contract_version == o.contract_version && + generated_at == o.generated_at && + availability == o.availability && + next_cursor == o.next_cursor && + missing_fields == o.missing_fields && + stale == o.stale + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [request_id, contract_version, generated_at, availability, next_cursor, missing_fields, stale].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/models/success_response.rb b/lib/replynodes/generated/replynodes/models/success_response.rb new file mode 100644 index 0000000..61e0777 --- /dev/null +++ b/lib/replynodes/generated/replynodes/models/success_response.rb @@ -0,0 +1,233 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +require 'date' +require 'time' + +module ReplyNodesGenerated + class SuccessResponse + attr_accessor :data + + attr_accessor :meta + + # Attribute mapping from ruby-style variable name to JSON key. + def self.attribute_map + { + :'data' => :'data', + :'meta' => :'meta' + } + end + + # Returns all the JSON keys this model knows about + def self.acceptable_attributes + attribute_map.values + end + + # Attribute type mapping. + def self.openapi_types + { + :'data' => :'Object', + :'meta' => :'ResponseMeta' + } + end + + # List of attributes with nullable: true + def self.openapi_nullable + Set.new([ + :'data', + ]) + end + + # Initializes the object + # @param [Hash] attributes Model attributes in the form of hash + def initialize(attributes = {}) + if (!attributes.is_a?(Hash)) + fail ArgumentError, "The input argument (attributes) must be a hash in `ReplyNodesGenerated::SuccessResponse` initialize method" + end + + # check to see if the attribute exists and convert string to symbol for hash key + attributes = attributes.each_with_object({}) { |(k, v), h| + if (!self.class.attribute_map.key?(k.to_sym)) + fail ArgumentError, "`#{k}` is not a valid attribute in `ReplyNodesGenerated::SuccessResponse`. Please check the name to make sure it's valid. List of attributes: " + self.class.attribute_map.keys.inspect + end + h[k.to_sym] = v + } + + if attributes.key?(:'data') + self.data = attributes[:'data'] + else + self.data = nil + end + + if attributes.key?(:'meta') + self.meta = attributes[:'meta'] + else + self.meta = nil + end + end + + # Show invalid properties with the reasons. Usually used together with valid? + # @return Array for valid properties with the reasons + def list_invalid_properties + warn '[DEPRECATED] the `list_invalid_properties` method is obsolete' + invalid_properties = Array.new + if @meta.nil? + invalid_properties.push('invalid value for "meta", meta cannot be nil.') + end + + invalid_properties + end + + # Check to see if the all the properties in the model are valid + # @return true if the model is valid + def valid? + warn '[DEPRECATED] the `valid?` method is obsolete' + return false if @meta.nil? + true + end + + # Checks equality by comparing each attribute. + # @param [Object] Object to be compared + def ==(o) + return true if self.equal?(o) + self.class == o.class && + data == o.data && + meta == o.meta + end + + # @see the `==` method + # @param [Object] Object to be compared + def eql?(o) + self == o + end + + # Calculates hash code according to all attributes. + # @return [Integer] Hash code + def hash + [data, meta].hash + end + + # Builds the object from hash + # @param [Hash] attributes Model attributes in the form of hash + # @return [Object] Returns the model itself + def self.build_from_hash(attributes) + return nil unless attributes.is_a?(Hash) + attributes = attributes.transform_keys(&:to_sym) + transformed_hash = {} + openapi_types.each_pair do |key, type| + if attributes.key?(attribute_map[key]) && attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = nil + elsif type =~ /\AArray<(.*)>/i + # check to ensure the input is an array given that the attribute + # is documented as an array but the input is not + if attributes[attribute_map[key]].is_a?(Array) + transformed_hash["#{key}"] = attributes[attribute_map[key]].map { |v| _deserialize($1, v) } + end + elsif !attributes[attribute_map[key]].nil? + transformed_hash["#{key}"] = _deserialize(type, attributes[attribute_map[key]]) + end + end + new(transformed_hash) + end + + # Deserializes the data based on type + # @param string type Data type + # @param string value Value to be deserialized + # @return [Object] Deserialized data + def self._deserialize(type, value) + case type.to_sym + when :Time + Time.parse(value) + when :Date + Date.parse(value) + when :String + value.to_s + when :Integer + value.to_i + when :Float + value.to_f + when :Boolean + if value.to_s =~ /\A(true|t|yes|y|1)\z/i + true + else + false + end + when :Object + # generic object (usually a Hash), return directly + value + when /\AArray<(?.+)>\z/ + inner_type = Regexp.last_match[:inner_type] + value.map { |v| _deserialize(inner_type, v) } + when /\AHash<(?.+?), (?.+)>\z/ + k_type = Regexp.last_match[:k_type] + v_type = Regexp.last_match[:v_type] + {}.tap do |hash| + value.each do |k, v| + hash[_deserialize(k_type, k)] = _deserialize(v_type, v) + end + end + else # model + # models (e.g. Pet) or oneOf + klass = ReplyNodesGenerated.const_get(type) + klass.respond_to?(:openapi_any_of) || klass.respond_to?(:openapi_one_of) ? klass.build(value) : klass.build_from_hash(value) + end + end + + # Returns the string representation of the object + # @return [String] String presentation of the object + def to_s + to_hash.to_s + end + + # to_body is an alias to to_hash (backward compatibility) + # @return [Hash] Returns the object in the form of hash + def to_body + to_hash + end + + # Returns the object in the form of hash + # @return [Hash] Returns the object in the form of hash + def to_hash + hash = {} + self.class.attribute_map.each_pair do |attr, param| + value = self.send(attr) + if value.nil? + is_nullable = self.class.openapi_nullable.include?(attr) + next if !is_nullable || (is_nullable && !instance_variable_defined?(:"@#{attr}")) + end + + hash[param] = _to_hash(value) + end + hash + end + + # Outputs non-array value in the form of hash + # For object, use to_hash. Otherwise, just return the value + # @param [Object] value Any valid value + # @return [Hash] Returns the value in the form of hash + def _to_hash(value) + if value.is_a?(Array) + value.compact.map { |v| _to_hash(v) } + elsif value.is_a?(Hash) + {}.tap do |hash| + value.each { |k, v| hash[k] = _to_hash(v) } + end + elsif value.respond_to? :to_hash + value.to_hash + else + value + end + end + + end + +end diff --git a/lib/replynodes/generated/replynodes/version.rb b/lib/replynodes/generated/replynodes/version.rb new file mode 100644 index 0000000..3c909ad --- /dev/null +++ b/lib/replynodes/generated/replynodes/version.rb @@ -0,0 +1,15 @@ +=begin +#ReplyNodes Fetcher API + +#SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET. + +The version of the OpenAPI document: v1 + +Generated by: https://openapi-generator.tech +Generator version: 7.10.0 + +=end + +module ReplyNodesGenerated + VERSION = '0.1.0' +end diff --git a/lib/replynodes/operation_registry.rb b/lib/replynodes/operation_registry.rb new file mode 100644 index 0000000..77a161f --- /dev/null +++ b/lib/replynodes/operation_registry.rb @@ -0,0 +1,847 @@ +# frozen_string_literal: true + +# This file is generated by scripts/generate_registry.py from the canonical +# ReplyNodes Fetcher OpenAPI contract. Do not hand-edit it. +module ReplyNodes + OPERATIONS = { + app_store_app: { + operation_id: "appStoreApp", + path: "/v1/appstore/app", + api_class: "AppStoreApi", + generated_method: :app_store_app, + parameters: [ + { name: :id, wire_name: "id", location: :query, required: false }, + { name: :app_id, wire_name: "appId", location: :query, required: false }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :lang, wire_name: "lang", location: :query, required: false }, + { name: :ratings, wire_name: "ratings", location: :query, required: false }, + ].freeze + }.freeze, + app_store_developer: { + operation_id: "appStoreDeveloper", + path: "/v1/appstore/developer", + api_class: "AppStoreApi", + generated_method: :app_store_developer, + parameters: [ + { name: :dev_id, wire_name: "devId", location: :query, required: true }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :lang, wire_name: "lang", location: :query, required: false }, + ].freeze + }.freeze, + app_store_list: { + operation_id: "appStoreList", + path: "/v1/appstore/list", + api_class: "AppStoreApi", + generated_method: :app_store_list, + parameters: [ + { name: :collection, wire_name: "collection", location: :query, required: false }, + { name: :category, wire_name: "category", location: :query, required: false }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :lang, wire_name: "lang", location: :query, required: false }, + { name: :num, wire_name: "num", location: :query, required: false }, + { name: :full_detail, wire_name: "fullDetail", location: :query, required: false }, + ].freeze + }.freeze, + app_store_privacy: { + operation_id: "appStorePrivacy", + path: "/v1/appstore/privacy", + api_class: "AppStoreApi", + generated_method: :app_store_privacy, + parameters: [ + { name: :id, wire_name: "id", location: :query, required: true }, + ].freeze + }.freeze, + app_store_ratings: { + operation_id: "appStoreRatings", + path: "/v1/appstore/ratings", + api_class: "AppStoreApi", + generated_method: :app_store_ratings, + parameters: [ + { name: :id, wire_name: "id", location: :query, required: false }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :app_id, wire_name: "appId", location: :query, required: false }, + ].freeze + }.freeze, + app_store_reviews: { + operation_id: "appStoreReviews", + path: "/v1/appstore/reviews", + api_class: "AppStoreApi", + generated_method: :app_store_reviews, + parameters: [ + { name: :id, wire_name: "id", location: :query, required: false }, + { name: :app_id, wire_name: "appId", location: :query, required: false }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :page, wire_name: "page", location: :query, required: false }, + { name: :sort, wire_name: "sort", location: :query, required: false }, + ].freeze + }.freeze, + app_store_search: { + operation_id: "appStoreSearch", + path: "/v1/appstore/search", + api_class: "AppStoreApi", + generated_method: :app_store_search, + parameters: [ + { name: :term, wire_name: "term", location: :query, required: true }, + { name: :num, wire_name: "num", location: :query, required: false }, + { name: :page, wire_name: "page", location: :query, required: false }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :lang, wire_name: "lang", location: :query, required: false }, + { name: :ids_only, wire_name: "idsOnly", location: :query, required: false }, + ].freeze + }.freeze, + app_store_similar: { + operation_id: "appStoreSimilar", + path: "/v1/appstore/similar", + api_class: "AppStoreApi", + generated_method: :app_store_similar, + parameters: [ + { name: :id, wire_name: "id", location: :query, required: false }, + { name: :app_id, wire_name: "appId", location: :query, required: false }, + ].freeze + }.freeze, + app_store_suggest: { + operation_id: "appStoreSuggest", + path: "/v1/appstore/suggest", + api_class: "AppStoreApi", + generated_method: :app_store_suggest, + parameters: [ + { name: :term, wire_name: "term", location: :query, required: true }, + ].freeze + }.freeze, + brand_fonts: { + operation_id: "brandFonts", + path: "/v1/brand/fonts", + api_class: "BrandApi", + generated_method: :brand_fonts, + parameters: [ + { name: :domain, wire_name: "domain", location: :query, required: false }, + { name: :url, wire_name: "url", location: :query, required: false }, + ].freeze + }.freeze, + brand_retrieve: { + operation_id: "brandRetrieve", + path: "/v1/brand/retrieve", + api_class: "BrandApi", + generated_method: :brand_retrieve, + parameters: [ + { name: :domain, wire_name: "domain", location: :query, required: false }, + { name: :url, wire_name: "url", location: :query, required: false }, + ].freeze + }.freeze, + brand_search: { + operation_id: "brandSearch", + path: "/v1/brand/search", + api_class: "BrandApi", + generated_method: :brand_search, + parameters: [ + { name: :query, wire_name: "query", location: :query, required: true }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + brand_styleguide: { + operation_id: "brandStyleguide", + path: "/v1/brand/styleguide", + api_class: "BrandApi", + generated_method: :brand_styleguide, + parameters: [ + { name: :domain, wire_name: "domain", location: :query, required: false }, + { name: :url, wire_name: "url", location: :query, required: false }, + ].freeze + }.freeze, + fomo_alerts: { + operation_id: "fomoAlerts", + path: "/v1/fomo/alerts", + api_class: "FomoApi", + generated_method: :fomo_alerts, + parameters: [ + { name: :type, wire_name: "type", location: :query, required: false }, + { name: :chain, wire_name: "chain", location: :query, required: false }, + { name: :since, wire_name: "since", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + fomo_leaderboard: { + operation_id: "fomoLeaderboard", + path: "/v1/fomo/leaderboard/{window}", + api_class: "FomoApi", + generated_method: :fomo_leaderboard, + parameters: [ + { name: :window, wire_name: "window", location: :path, required: true }, + { name: :chain, wire_name: "chain", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + fomo_notifications: { + operation_id: "fomoNotifications", + path: "/v1/fomo/notifications", + api_class: "FomoApi", + generated_method: :fomo_notifications, + parameters: [ + { name: :type, wire_name: "type", location: :query, required: false }, + { name: :chain, wire_name: "chain", location: :query, required: false }, + { name: :since, wire_name: "since", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + fomo_search: { + operation_id: "fomoSearch", + path: "/v1/fomo/search", + api_class: "FomoApi", + generated_method: :fomo_search, + parameters: [ + { name: :q, wire_name: "q", location: :query, required: true }, + { name: :type, wire_name: "type", location: :query, required: false }, + { name: :chain, wire_name: "chain", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + fomo_thesis: { + operation_id: "fomoThesis", + path: "/v1/fomo/thesis", + api_class: "FomoApi", + generated_method: :fomo_thesis, + parameters: [ + { name: :chain, wire_name: "chain", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + fomo_thesis_by_token: { + operation_id: "fomoThesisByToken", + path: "/v1/fomo/thesis/token/{mint}", + api_class: "FomoApi", + generated_method: :fomo_thesis_by_token, + parameters: [ + { name: :mint, wire_name: "mint", location: :path, required: true }, + { name: :network, wire_name: "network", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + fomo_thesis_by_user: { + operation_id: "fomoThesisByUser", + path: "/v1/fomo/thesis/user/{id}", + api_class: "FomoApi", + generated_method: :fomo_thesis_by_user, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :chain, wire_name: "chain", location: :query, required: false }, + { name: :sort, wire_name: "sort", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + fomo_thesis_by_user_token: { + operation_id: "fomoThesisByUserToken", + path: "/v1/fomo/thesis/user/{id}/token/{address}", + api_class: "FomoApi", + generated_method: :fomo_thesis_by_user_token, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :address, wire_name: "address", location: :path, required: true }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + fomo_token_holders: { + operation_id: "fomoTokenHolders", + path: "/v1/fomo/tokens/{address}/holders", + api_class: "FomoApi", + generated_method: :fomo_token_holders, + parameters: [ + { name: :address, wire_name: "address", location: :path, required: true }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + fomo_tokens_graduated: { + operation_id: "fomoTokensGraduated", + path: "/v1/fomo/tokens/graduated", + api_class: "FomoApi", + generated_method: :fomo_tokens_graduated, + parameters: [ + { name: :chain, wire_name: "chain", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + fomo_tokens_most_held: { + operation_id: "fomoTokensMostHeld", + path: "/v1/fomo/tokens/most-held", + api_class: "FomoApi", + generated_method: :fomo_tokens_most_held, + parameters: [ + { name: :chain, wire_name: "chain", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + fomo_tokens_trending: { + operation_id: "fomoTokensTrending", + path: "/v1/fomo/tokens/trending", + api_class: "FomoApi", + generated_method: :fomo_tokens_trending, + parameters: [ + { name: :chain, wire_name: "chain", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + fomo_trade: { + operation_id: "fomoTrade", + path: "/v1/fomo/trades/{trade_id}", + api_class: "FomoApi", + generated_method: :fomo_trade, + parameters: [ + { name: :trade_id, wire_name: "trade_id", location: :path, required: true }, + ].freeze + }.freeze, + fomo_user_balances: { + operation_id: "fomoUserBalances", + path: "/v1/fomo/users/{handle}/balances", + api_class: "FomoApi", + generated_method: :fomo_user_balances, + parameters: [ + { name: :handle, wire_name: "handle", location: :path, required: true }, + ].freeze + }.freeze, + fomo_user_profile: { + operation_id: "fomoUserProfile", + path: "/v1/fomo/users/{handle}", + api_class: "FomoApi", + generated_method: :fomo_user_profile, + parameters: [ + { name: :handle, wire_name: "handle", location: :path, required: true }, + ].freeze + }.freeze, + fomo_user_trades: { + operation_id: "fomoUserTrades", + path: "/v1/fomo/users/{handle}/trades", + api_class: "FomoApi", + generated_method: :fomo_user_trades, + parameters: [ + { name: :handle, wire_name: "handle", location: :path, required: true }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + google_maps_place_details: { + operation_id: "googleMapsPlaceDetails", + path: "/v1/googlemaps/details/{place_id}", + api_class: "GoogleMapsApi", + generated_method: :google_maps_place_details, + parameters: [ + { name: :place_id, wire_name: "place_id", location: :path, required: true }, + ].freeze + }.freeze, + google_maps_place_reviews: { + operation_id: "googleMapsPlaceReviews", + path: "/v1/googlemaps/reviews/{place_id}", + api_class: "GoogleMapsApi", + generated_method: :google_maps_place_reviews, + parameters: [ + { name: :place_id, wire_name: "place_id", location: :path, required: true }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + google_maps_search_places: { + operation_id: "googleMapsSearchPlaces", + path: "/v1/googlemaps/search", + api_class: "GoogleMapsApi", + generated_method: :google_maps_search_places, + parameters: [ + { name: :query, wire_name: "query", location: :query, required: true }, + { name: :lat, wire_name: "lat", location: :query, required: false }, + { name: :lng, wire_name: "lng", location: :query, required: false }, + { name: :radius, wire_name: "radius", location: :query, required: false }, + ].freeze + }.freeze, + google_play_app_details: { + operation_id: "googlePlayAppDetails", + path: "/v1/googleplay/app_details/{id}", + api_class: "GooglePlayApi", + generated_method: :google_play_app_details, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :language, wire_name: "language", location: :query, required: false }, + ].freeze + }.freeze, + google_play_availability: { + operation_id: "googlePlayAvailability", + path: "/v1/googleplay/availability/{id}", + api_class: "GooglePlayApi", + generated_method: :google_play_availability, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :countries, wire_name: "countries", location: :query, required: false }, + { name: :language, wire_name: "language", location: :query, required: false }, + ].freeze + }.freeze, + google_play_categories: { + operation_id: "googlePlayCategories", + path: "/v1/googleplay/categories", + api_class: "GooglePlayApi", + generated_method: :google_play_categories, + parameters: [ + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :language, wire_name: "language", location: :query, required: false }, + ].freeze + }.freeze, + google_play_category_apps: { + operation_id: "googlePlayCategoryApps", + path: "/v1/googleplay/category_apps/{category}", + api_class: "GooglePlayApi", + generated_method: :google_play_category_apps, + parameters: [ + { name: :category, wire_name: "category", location: :path, required: true }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :language, wire_name: "language", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + google_play_data_safety: { + operation_id: "googlePlayDataSafety", + path: "/v1/googleplay/data_safety/{id}", + api_class: "GooglePlayApi", + generated_method: :google_play_data_safety, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :language, wire_name: "language", location: :query, required: false }, + ].freeze + }.freeze, + google_play_developer: { + operation_id: "googlePlayDeveloper", + path: "/v1/googleplay/developer", + api_class: "GooglePlayApi", + generated_method: :google_play_developer, + parameters: [ + { name: :dev_id, wire_name: "dev_id", location: :query, required: true }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :language, wire_name: "language", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + google_play_permissions: { + operation_id: "googlePlayPermissions", + path: "/v1/googleplay/permissions/{id}", + api_class: "GooglePlayApi", + generated_method: :google_play_permissions, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :language, wire_name: "language", location: :query, required: false }, + ].freeze + }.freeze, + google_play_reviews: { + operation_id: "googlePlayReviews", + path: "/v1/googleplay/reviews/{id}", + api_class: "GooglePlayApi", + generated_method: :google_play_reviews, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :language, wire_name: "language", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + { name: :sort, wire_name: "sort", location: :query, required: false }, + { name: :score, wire_name: "score", location: :query, required: false }, + { name: :next_token, wire_name: "next_token", location: :query, required: false }, + ].freeze + }.freeze, + google_play_search: { + operation_id: "googlePlaySearch", + path: "/v1/googleplay/search", + api_class: "GooglePlayApi", + generated_method: :google_play_search, + parameters: [ + { name: :term, wire_name: "term", location: :query, required: true }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :language, wire_name: "language", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + google_play_similar_apps: { + operation_id: "googlePlaySimilarApps", + path: "/v1/googleplay/similar_apps/{id}", + api_class: "GooglePlayApi", + generated_method: :google_play_similar_apps, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :language, wire_name: "language", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + google_play_suggest: { + operation_id: "googlePlaySuggest", + path: "/v1/googleplay/suggest", + api_class: "GooglePlayApi", + generated_method: :google_play_suggest, + parameters: [ + { name: :term, wire_name: "term", location: :query, required: true }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :language, wire_name: "language", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + google_search: { + operation_id: "googleSearch", + path: "/v1/web/search", + api_class: "GoogleApi", + generated_method: :google_search, + parameters: [ + { name: :text, wire_name: "text", location: :query, required: true }, + { name: :engines, wire_name: "engines", location: :query, required: false }, + { name: :lang, wire_name: "lang", location: :query, required: false }, + { name: :region, wire_name: "region", location: :query, required: false }, + { name: :date, wire_name: "date", location: :query, required: false }, + { name: :site, wire_name: "site", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + { name: :start, wire_name: "start", location: :query, required: false }, + { name: :cursor, wire_name: "cursor", location: :query, required: false }, + ].freeze + }.freeze, + google_shopping_product_offers: { + operation_id: "googleShoppingProductOffers", + path: "/v1/googleshopping/product_offers", + api_class: "GoogleShoppingApi", + generated_method: :google_shopping_product_offers, + parameters: [ + { name: :product_id, wire_name: "product_id", location: :query, required: false }, + { name: :text, wire_name: "text", location: :query, required: true }, + { name: :lang, wire_name: "lang", location: :query, required: false }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :domain, wire_name: "domain", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + google_shopping_search: { + operation_id: "googleShoppingSearch", + path: "/v1/googleshopping/search", + api_class: "GoogleShoppingApi", + generated_method: :google_shopping_search, + parameters: [ + { name: :text, wire_name: "text", location: :query, required: true }, + { name: :lang, wire_name: "lang", location: :query, required: false }, + { name: :country, wire_name: "country", location: :query, required: false }, + { name: :domain, wire_name: "domain", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + { name: :start, wire_name: "start", location: :query, required: false }, + ].freeze + }.freeze, + hacker_news_item: { + operation_id: "hackerNewsItem", + path: "/v1/hackernews/item/{id}", + api_class: "HackerNewsApi", + generated_method: :hacker_news_item, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :depth, wire_name: "depth", location: :query, required: false }, + ].freeze + }.freeze, + hacker_news_search: { + operation_id: "hackerNewsSearch", + path: "/v1/hackernews/search", + api_class: "HackerNewsApi", + generated_method: :hacker_news_search, + parameters: [ + { name: :q, wire_name: "q", location: :query, required: true }, + { name: :tags, wire_name: "tags", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + { name: :page, wire_name: "page", location: :query, required: false }, + ].freeze + }.freeze, + hacker_news_stories_ask: { + operation_id: "hackerNewsStoriesAsk", + path: "/v1/hackernews/stories_ask", + api_class: "HackerNewsApi", + generated_method: :hacker_news_stories_ask, + parameters: [ + { name: :limit, wire_name: "limit", location: :query, required: false }, + { name: :page, wire_name: "page", location: :query, required: false }, + ].freeze + }.freeze, + hacker_news_stories_best: { + operation_id: "hackerNewsStoriesBest", + path: "/v1/hackernews/stories_best", + api_class: "HackerNewsApi", + generated_method: :hacker_news_stories_best, + parameters: [ + { name: :limit, wire_name: "limit", location: :query, required: false }, + { name: :page, wire_name: "page", location: :query, required: false }, + ].freeze + }.freeze, + hacker_news_stories_job: { + operation_id: "hackerNewsStoriesJob", + path: "/v1/hackernews/stories_job", + api_class: "HackerNewsApi", + generated_method: :hacker_news_stories_job, + parameters: [ + { name: :limit, wire_name: "limit", location: :query, required: false }, + { name: :page, wire_name: "page", location: :query, required: false }, + ].freeze + }.freeze, + hacker_news_stories_new: { + operation_id: "hackerNewsStoriesNew", + path: "/v1/hackernews/stories_new", + api_class: "HackerNewsApi", + generated_method: :hacker_news_stories_new, + parameters: [ + { name: :limit, wire_name: "limit", location: :query, required: false }, + { name: :page, wire_name: "page", location: :query, required: false }, + ].freeze + }.freeze, + hacker_news_stories_show: { + operation_id: "hackerNewsStoriesShow", + path: "/v1/hackernews/stories_show", + api_class: "HackerNewsApi", + generated_method: :hacker_news_stories_show, + parameters: [ + { name: :limit, wire_name: "limit", location: :query, required: false }, + { name: :page, wire_name: "page", location: :query, required: false }, + ].freeze + }.freeze, + hacker_news_stories_top: { + operation_id: "hackerNewsStoriesTop", + path: "/v1/hackernews/stories_top", + api_class: "HackerNewsApi", + generated_method: :hacker_news_stories_top, + parameters: [ + { name: :limit, wire_name: "limit", location: :query, required: false }, + { name: :page, wire_name: "page", location: :query, required: false }, + ].freeze + }.freeze, + hacker_news_user: { + operation_id: "hackerNewsUser", + path: "/v1/hackernews/user/{handle}", + api_class: "HackerNewsApi", + generated_method: :hacker_news_user, + parameters: [ + { name: :handle, wire_name: "handle", location: :path, required: true }, + ].freeze + }.freeze, + instagram_posts: { + operation_id: "instagramPosts", + path: "/v1/instagram/posts", + api_class: "InstagramApi", + generated_method: :instagram_posts, + parameters: [ + { name: :username, wire_name: "username", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + { name: :cursor, wire_name: "cursor", location: :query, required: false }, + ].freeze + }.freeze, + instagram_profile: { + operation_id: "instagramProfile", + path: "/v1/instagram/profile", + api_class: "InstagramApi", + generated_method: :instagram_profile, + parameters: [ + { name: :username, wire_name: "username", location: :query, required: false }, + ].freeze + }.freeze, + reddit_post_by_id: { + operation_id: "redditPostById", + path: "/v1/reddit/post_by_id/{id}", + api_class: "RedditApi", + generated_method: :reddit_post_by_id, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :context, wire_name: "context", location: :query, required: false }, + ].freeze + }.freeze, + reddit_post_by_permalink: { + operation_id: "redditPostByPermalink", + path: "/v1/reddit/post_by_permalink", + api_class: "RedditApi", + generated_method: :reddit_post_by_permalink, + parameters: [ + { name: :permalink, wire_name: "permalink", location: :query, required: false }, + { name: :context, wire_name: "context", location: :query, required: false }, + ].freeze + }.freeze, + reddit_search: { + operation_id: "redditSearch", + path: "/v1/reddit/search_posts", + api_class: "RedditApi", + generated_method: :reddit_search, + parameters: [ + { name: :query, wire_name: "query", location: :query, required: true }, + { name: :sort, wire_name: "sort", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + { name: :time_filter, wire_name: "time_filter", location: :query, required: false }, + ].freeze + }.freeze, + reddit_subreddit_posts: { + operation_id: "redditSubredditPosts", + path: "/v1/reddit/subreddit_posts/{subreddit}", + api_class: "RedditApi", + generated_method: :reddit_subreddit_posts, + parameters: [ + { name: :subreddit, wire_name: "subreddit", location: :path, required: true }, + { name: :category, wire_name: "category", location: :query, required: false }, + { name: :time_filter, wire_name: "time_filter", location: :query, required: false }, + { name: :sort, wire_name: "sort", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + reddit_user_activity: { + operation_id: "redditUserActivity", + path: "/v1/reddit/user_activity/{username}", + api_class: "RedditApi", + generated_method: :reddit_user_activity, + parameters: [ + { name: :username, wire_name: "username", location: :path, required: true }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + { name: :sort, wire_name: "sort", location: :query, required: false }, + ].freeze + }.freeze, + reddit_user_posts: { + operation_id: "redditUserPosts", + path: "/v1/reddit/user_posts/{username}", + api_class: "RedditApi", + generated_method: :reddit_user_posts, + parameters: [ + { name: :username, wire_name: "username", location: :path, required: true }, + { name: :category, wire_name: "category", location: :query, required: false }, + { name: :time_filter, wire_name: "time_filter", location: :query, required: false }, + { name: :sort, wire_name: "sort", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + tiktok_post: { + operation_id: "tiktokPost", + path: "/v1/tiktok/post/{id}", + api_class: "TiktokApi", + generated_method: :tiktok_post, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + ].freeze + }.freeze, + tiktok_user: { + operation_id: "tiktokUser", + path: "/v1/tiktok/user/{handle}", + api_class: "TiktokApi", + generated_method: :tiktok_user, + parameters: [ + { name: :handle, wire_name: "handle", location: :path, required: true }, + ].freeze + }.freeze, + tiktok_user_posts: { + operation_id: "tiktokUserPosts", + path: "/v1/tiktok/user_posts/{handle}", + api_class: "TiktokApi", + generated_method: :tiktok_user_posts, + parameters: [ + { name: :handle, wire_name: "handle", location: :path, required: true }, + { name: :count, wire_name: "count", location: :query, required: false }, + { name: :cursor, wire_name: "cursor", location: :query, required: false }, + ].freeze + }.freeze, + web_brand: { + operation_id: "webBrand", + path: "/v1/webcontext/brand", + api_class: "WebApi", + generated_method: :web_brand, + parameters: [ + { name: :url, wire_name: "url", location: :query, required: true }, + ].freeze + }.freeze, + web_crawl: { + operation_id: "webCrawl", + path: "/v1/webcontext/crawl", + api_class: "WebApi", + generated_method: :web_crawl, + parameters: [ + { name: :url, wire_name: "url", location: :query, required: true }, + { name: :max_pages, wire_name: "max_pages", location: :query, required: false }, + { name: :max_depth, wire_name: "max_depth", location: :query, required: false }, + ].freeze + }.freeze, + web_map: { + operation_id: "webMap", + path: "/v1/webcontext/map", + api_class: "WebApi", + generated_method: :web_map, + parameters: [ + { name: :url, wire_name: "url", location: :query, required: true }, + ].freeze + }.freeze, + web_scrape: { + operation_id: "webScrape", + path: "/v1/webcontext/scrape", + api_class: "WebApi", + generated_method: :web_scrape, + parameters: [ + { name: :url, wire_name: "url", location: :query, required: true }, + { name: :include_selectors, wire_name: "include_selectors", location: :query, required: false }, + { name: :exclude_selectors, wire_name: "exclude_selectors", location: :query, required: false }, + ].freeze + }.freeze, + youtube_channel: { + operation_id: "youtubeChannel", + path: "/v1/youtube/channel/{id}", + api_class: "YoutubeApi", + generated_method: :youtube_channel, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :language, wire_name: "language", location: :query, required: false }, + ].freeze + }.freeze, + youtube_comments: { + operation_id: "youtubeComments", + path: "/v1/youtube/comments/{id}", + api_class: "YoutubeApi", + generated_method: :youtube_comments, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + youtube_playlist: { + operation_id: "youtubePlaylist", + path: "/v1/youtube/playlist/{id}", + api_class: "YoutubeApi", + generated_method: :youtube_playlist, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :language, wire_name: "language", location: :query, required: false }, + ].freeze + }.freeze, + youtube_related: { + operation_id: "youtubeRelated", + path: "/v1/youtube/related/{id}", + api_class: "YoutubeApi", + generated_method: :youtube_related, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :language, wire_name: "language", location: :query, required: false }, + ].freeze + }.freeze, + youtube_search: { + operation_id: "youtubeSearch", + path: "/v1/youtube/search", + api_class: "YoutubeApi", + generated_method: :youtube_search, + parameters: [ + { name: :term, wire_name: "term", location: :query, required: true }, + { name: :language, wire_name: "language", location: :query, required: false }, + { name: :limit, wire_name: "limit", location: :query, required: false }, + ].freeze + }.freeze, + youtube_transcript: { + operation_id: "youtubeTranscript", + path: "/v1/youtube/transcript/{id}", + api_class: "YoutubeApi", + generated_method: :youtube_transcript, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :language, wire_name: "language", location: :query, required: false }, + ].freeze + }.freeze, + youtube_video: { + operation_id: "youtubeVideo", + path: "/v1/youtube/video/{id}", + api_class: "YoutubeApi", + generated_method: :youtube_video, + parameters: [ + { name: :id, wire_name: "id", location: :path, required: true }, + { name: :language, wire_name: "language", location: :query, required: false }, + ].freeze + }.freeze, + }.freeze + ALIASES = {}.freeze +end diff --git a/lib/replynodes/response.rb b/lib/replynodes/response.rb new file mode 100644 index 0000000..74deed7 --- /dev/null +++ b/lib/replynodes/response.rb @@ -0,0 +1,72 @@ +# frozen_string_literal: true + +module ReplyNodes + class Response + attr_reader :data, :meta, :status, :headers, :raw + + def initialize(raw, status, headers) + @raw = raw + @status = status + @headers = headers || {} + @data = raw.respond_to?(:data) ? raw.data : nil + @meta = raw.respond_to?(:meta) ? raw.meta : nil + end + + def request_id + return meta.request_id if meta.respond_to?(:request_id) + + header_value("x-request-id") + end + + def next_cursor + if meta.respond_to?(:next_cursor) && !meta.next_cursor.nil? + return meta.next_cursor + end + + pagination_value(:next_cursor) + end + + def has_more? + value = pagination_value(:has_more) + value == true + end + + def pagination + source = data_hash + return nil unless source + + value = source[:pagination] || source["pagination"] + value.respond_to?(:to_h) ? value.to_h : nil + end + + def to_h + { data: data, meta: meta, status: status, headers: headers } + end + + private + + def header_value(wanted) + headers.to_h.each do |key, value| + return value if key.to_s.downcase == wanted + end + nil + end + + def pagination_value(key) + source = data_hash + return nil unless source.is_a?(Hash) + + pagination = source[:pagination] || source["pagination"] + return pagination[key] || pagination[key.to_s] if pagination.is_a?(Hash) + + source[key] || source[key.to_s] + end + + def data_hash + return data.to_h if data.respond_to?(:to_h) + return data if data.is_a?(Hash) + + nil + end + end +end diff --git a/lib/replynodes/version.rb b/lib/replynodes/version.rb new file mode 100644 index 0000000..9247a12 --- /dev/null +++ b/lib/replynodes/version.rb @@ -0,0 +1,5 @@ +# frozen_string_literal: true + +module ReplyNodes + VERSION = "0.1.0" +end diff --git a/openapi/replynodes-fetcher.openapi.json b/openapi/replynodes-fetcher.openapi.json new file mode 100644 index 0000000..412f49a --- /dev/null +++ b/openapi/replynodes-fetcher.openapi.json @@ -0,0 +1,18751 @@ +{ + "openapi": "3.0.3", + "info": { + "title": "ReplyNodes Fetcher API", + "version": "v1", + "description": "SDK contract for ReplyNodes public, read-only data operations. Every SDK operation is an authenticated HTTP GET." + }, + "servers": [ + { + "url": "https://api.replynodes.com", + "description": "ReplyNodes production gateway" + } + ], + "components": { + "securitySchemes": { + "bearerAuth": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "rn_test_<64hex> or rn_live_<64hex>", + "description": "API key. Paste the raw key only (e.g. rn_test_...) — the \"Bearer \" prefix is added automatically." + } + }, + "headers": { + "X-Request-Id": { + "description": "Correlation identifier returned by the gateway and echoed in meta.request_id.", + "schema": { + "type": "string" + } + } + }, + "schemas": { + "Pagination": { + "type": "object", + "properties": { + "next_cursor": { + "type": "string" + }, + "has_more": { + "type": "boolean" + }, + "page": { + "type": "integer" + }, + "limit": { + "type": "integer" + } + }, + "additionalProperties": true + }, + "ResponseMeta": { + "type": "object", + "required": [ + "request_id" + ], + "properties": { + "request_id": { + "type": "string" + }, + "contract_version": { + "type": "string" + }, + "generated_at": { + "type": "string", + "format": "date-time" + }, + "availability": { + "type": "string" + }, + "next_cursor": { + "type": "string" + }, + "missing_fields": { + "type": "array", + "items": { + "type": "string" + } + }, + "stale": { + "type": "boolean" + } + }, + "additionalProperties": true + }, + "SuccessResponse": { + "type": "object", + "required": [ + "data", + "meta" + ], + "properties": { + "data": {}, + "meta": { + "$ref": "#/components/schemas/ResponseMeta" + } + }, + "additionalProperties": false + }, + "BrandFontsData": { + "type": "object", + "required": [ + "domain", + "url", + "count" + ], + "properties": { + "domain": { + "type": "string" + }, + "url": { + "type": "string", + "format": "uri" + }, + "count": { + "type": "integer", + "minimum": 0 + }, + "words_count": { + "type": "integer", + "minimum": 0, + "description": "Word count reported by the rendered page metadata, when available." + }, + "fonts": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": true + } + } + }, + "additionalProperties": false + }, + "BrandFontsResponse": { + "type": "object", + "required": [ + "data", + "meta" + ], + "properties": { + "data": { + "$ref": "#/components/schemas/BrandFontsData" + }, + "meta": { + "$ref": "#/components/schemas/ResponseMeta" + } + }, + "additionalProperties": false + }, + "ErrorDetail": { + "type": "object", + "required": [ + "code", + "message", + "request_id" + ], + "properties": { + "code": { + "type": "string" + }, + "message": { + "type": "string" + }, + "request_id": { + "type": "string" + } + }, + "additionalProperties": false + }, + "ErrorResponse": { + "type": "object", + "required": [ + "error" + ], + "properties": { + "error": { + "$ref": "#/components/schemas/ErrorDetail" + } + }, + "additionalProperties": false + }, + "PaymentRequired": { + "type": "object", + "required": [ + "x402Version", + "error", + "resource", + "accepts", + "extensions" + ], + "properties": { + "x402Version": { + "type": "integer", + "enum": [ + 2 + ] + }, + "error": { + "type": "string" + }, + "resource": { + "type": "object", + "required": [ + "url", + "mimeType" + ], + "properties": { + "url": { + "type": "string", + "format": "uri" + }, + "mimeType": { + "type": "string" + } + }, + "additionalProperties": false + }, + "accepts": { + "type": "array", + "minItems": 1, + "items": { + "$ref": "#/components/schemas/PaymentRequirements" + } + }, + "extensions": { + "oneOf": [ + { + "$ref": "#/components/schemas/PaymentRequiredAccountlessExtensions" + }, + { + "$ref": "#/components/schemas/PaymentRequiredPrepaidExtensions" + } + ] + } + }, + "additionalProperties": false + }, + "PaymentRequiredAccountlessExtensions": { + "type": "object", + "required": [ + "x-replynodes-accountless" + ], + "properties": { + "x-replynodes-accountless": { + "type": "object", + "required": [ + "payment_mode", + "bearer_supported", + "prepaid_supported" + ], + "properties": { + "payment_mode": { + "type": "string", + "enum": [ + "x402_only" + ] + }, + "bearer_supported": { + "type": "boolean", + "enum": [ + false + ] + }, + "prepaid_supported": { + "type": "boolean", + "enum": [ + false + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "PaymentRequiredPrepaidExtensions": { + "type": "object", + "required": [ + "topup" + ], + "properties": { + "topup": { + "type": "object", + "required": [ + "topup_url" + ], + "properties": { + "topup_url": { + "type": "string", + "enum": [ + "/v1/billing/topup/intents" + ] + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + }, + "CreditTopupRequired": { + "type": "object", + "required": [ + "code", + "balance_micro", + "price_micro", + "topup_url" + ], + "properties": { + "code": { + "type": "string", + "enum": [ + "topup_required" + ] + }, + "balance_micro": { + "type": "integer" + }, + "price_micro": { + "type": "integer" + }, + "topup_url": { + "type": "string", + "enum": [ + "/v1/billing/topup/intents" + ] + } + }, + "additionalProperties": false + }, + "PaymentRequiredResponse": { + "oneOf": [ + { + "$ref": "#/components/schemas/PaymentRequired" + }, + { + "$ref": "#/components/schemas/CreditTopupRequired" + } + ] + }, + "PaymentRequirements": { + "type": "object", + "required": [ + "scheme", + "network", + "asset", + "amount", + "payTo", + "maxTimeoutSeconds" + ], + "properties": { + "scheme": { + "type": "string" + }, + "network": { + "type": "string" + }, + "asset": { + "type": "string" + }, + "amount": { + "type": "string" + }, + "payTo": { + "type": "string" + }, + "maxTimeoutSeconds": { + "type": "integer" + }, + "extra": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + } + }, + "security": [ + { + "bearerAuth": [] + } + ], + "paths": { + "/v1/appstore/app": { + "get": { + "operationId": "appStoreApp", + "summary": "Look up one public App Store application", + "description": "Look up one public App Store application. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "appStore" + ], + "parameters": [ + { + "name": "id", + "in": "query", + "required": false, + "description": "Numeric track id; provide this or appId.", + "schema": { + "type": "string" + } + }, + { + "name": "appId", + "in": "query", + "required": false, + "description": "Bundle id; provide this or id.", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "lang", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + }, + { + "name": "ratings", + "in": "query", + "required": false, + "description": "Include ratings information.", + "schema": { + "type": "boolean" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/appstore/developer": { + "get": { + "operationId": "appStoreDeveloper", + "summary": "List applications by developer", + "description": "List applications by developer. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "appStore" + ], + "parameters": [ + { + "name": "devId", + "in": "query", + "required": true, + "description": "public developer identifier.", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "lang", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/appstore/list": { + "get": { + "operationId": "appStoreList", + "summary": "List applications from an iTunes collection", + "description": "List applications from an iTunes collection. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "appStore" + ], + "parameters": [ + { + "name": "collection", + "in": "query", + "required": false, + "description": "Provider collection constant.", + "schema": { + "type": "string" + } + }, + { + "name": "category", + "in": "query", + "required": false, + "description": "Provider category constant.", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "lang", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + }, + { + "name": "num", + "in": "query", + "required": false, + "description": "Number of applications; values outside 1..200 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 200 + } + }, + { + "name": "fullDetail", + "in": "query", + "required": false, + "description": "Request detail enrichment.", + "schema": { + "type": "boolean" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/appstore/privacy": { + "get": { + "operationId": "appStorePrivacy", + "summary": "Read public App Store privacy details", + "description": "Read public App Store privacy details. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "appStore" + ], + "parameters": [ + { + "name": "id", + "in": "query", + "required": true, + "description": "public application identifier.", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/appstore/ratings": { + "get": { + "operationId": "appStoreRatings", + "summary": "Read public app ratings", + "description": "Read public app ratings. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "appStore" + ], + "parameters": [ + { + "name": "id", + "in": "query", + "required": false, + "description": "public application identifier; provide this or appId.", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "appId", + "in": "query", + "required": false, + "description": "Bundle id; provide this or id.", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/appstore/reviews": { + "get": { + "operationId": "appStoreReviews", + "summary": "Read a page of public app reviews", + "description": "Read a page of public app reviews. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "appStore" + ], + "parameters": [ + { + "name": "id", + "in": "query", + "required": false, + "description": "public application identifier; provide this or appId.", + "schema": { + "type": "string" + } + }, + { + "name": "appId", + "in": "query", + "required": false, + "description": "Bundle id; provide this or id.", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "description": "Review page; values outside 1..10 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 10 + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "description": "Provider review sort constant.", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/appstore/search": { + "get": { + "operationId": "appStoreSearch", + "summary": "Search public App Store applications by term", + "description": "Search public App Store applications by term. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "appStore" + ], + "parameters": [ + { + "name": "term", + "in": "query", + "required": true, + "description": "Search term.", + "schema": { + "type": "string" + } + }, + { + "name": "num", + "in": "query", + "required": false, + "description": "Number of results; values outside 1..50 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 50 + } + }, + { + "name": "page", + "in": "query", + "required": false, + "description": "Result page.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 200 + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "lang", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + }, + { + "name": "idsOnly", + "in": "query", + "required": false, + "description": "Return ids without detail lookups.", + "schema": { + "type": "boolean" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/appstore/similar": { + "get": { + "operationId": "appStoreSimilar", + "summary": "List apps related to an application", + "description": "List apps related to an application. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "appStore" + ], + "parameters": [ + { + "name": "id", + "in": "query", + "required": false, + "description": "public application identifier; provide this or appId.", + "schema": { + "type": "string" + } + }, + { + "name": "appId", + "in": "query", + "required": false, + "description": "Bundle id; provide this or id.", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/appstore/suggest": { + "get": { + "operationId": "appStoreSuggest", + "summary": "Suggest public App Store search terms", + "description": "Suggest public App Store search terms. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "appStore" + ], + "parameters": [ + { + "name": "term", + "in": "query", + "required": true, + "description": "Search term.", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/brand/fonts": { + "get": { + "operationId": "brandFonts", + "tags": [ + "brand" + ], + "parameters": [ + { + "name": "domain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "url", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BrandFontsResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/brand/retrieve": { + "get": { + "operationId": "brandRetrieve", + "tags": [ + "brand" + ], + "parameters": [ + { + "name": "domain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "url", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/brand/search": { + "get": { + "operationId": "brandSearch", + "tags": [ + "brand" + ], + "parameters": [ + { + "name": "query", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/brand/styleguide": { + "get": { + "operationId": "brandStyleguide", + "tags": [ + "brand" + ], + "parameters": [ + { + "name": "domain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "url", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/alerts": { + "get": { + "operationId": "fomoAlerts", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "type", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "chain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "since", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/leaderboard/{window}": { + "get": { + "operationId": "fomoLeaderboard", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "window", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "chain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/notifications": { + "get": { + "operationId": "fomoNotifications", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "type", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "chain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "since", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/search": { + "get": { + "operationId": "fomoSearch", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "q", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "type", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "chain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/thesis": { + "get": { + "operationId": "fomoThesis", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "chain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/thesis/token/{mint}": { + "get": { + "operationId": "fomoThesisByToken", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "mint", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "network", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/thesis/user/{id}": { + "get": { + "operationId": "fomoThesisByUser", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "chain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/thesis/user/{id}/token/{address}": { + "get": { + "operationId": "fomoThesisByUserToken", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "address", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/tokens/graduated": { + "get": { + "operationId": "fomoTokensGraduated", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "chain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/tokens/most-held": { + "get": { + "operationId": "fomoTokensMostHeld", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "chain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/tokens/trending": { + "get": { + "operationId": "fomoTokensTrending", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "chain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/tokens/{address}/holders": { + "get": { + "operationId": "fomoTokenHolders", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "address", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/trades/{trade_id}": { + "get": { + "operationId": "fomoTrade", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "trade_id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/users/{handle}": { + "get": { + "operationId": "fomoUserProfile", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "handle", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/users/{handle}/balances": { + "get": { + "operationId": "fomoUserBalances", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "handle", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/fomo/users/{handle}/trades": { + "get": { + "operationId": "fomoUserTrades", + "tags": [ + "fomo" + ], + "parameters": [ + { + "name": "handle", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googlemaps/details/{place_id}": { + "get": { + "operationId": "googleMapsPlaceDetails", + "tags": [ + "googleMaps" + ], + "parameters": [ + { + "name": "place_id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googlemaps/reviews/{place_id}": { + "get": { + "operationId": "googleMapsPlaceReviews", + "tags": [ + "googleMaps" + ], + "parameters": [ + { + "name": "place_id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googlemaps/search": { + "get": { + "operationId": "googleMapsSearchPlaces", + "tags": [ + "googleMaps" + ], + "parameters": [ + { + "name": "query", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "lat", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "lng", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "radius", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googleplay/app_details/{id}": { + "get": { + "operationId": "googlePlayAppDetails", + "summary": "Fetch a single Google Play app's public detail record", + "description": "Fetch a single Google Play app's public detail record. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "googlePlay" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "Google Play package id (e.g. com.nike.snkrs).", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googleplay/availability/{id}": { + "get": { + "operationId": "googlePlayAvailability", + "summary": "Fetch a Google Play app's per-storefront availability", + "description": "Fetch a Google Play app's per-storefront availability. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "googlePlay" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "Google Play package id (e.g. com.nike.snkrs).", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "countries", + "in": "query", + "required": false, + "description": "Comma-separated storefront codes.", + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googleplay/categories": { + "get": { + "operationId": "googlePlayCategories", + "summary": "List available Google Play category identifiers", + "description": "List available Google Play category identifiers. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "googlePlay" + ], + "parameters": [ + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googleplay/category_apps/{category}": { + "get": { + "operationId": "googlePlayCategoryApps", + "summary": "Fetch top public apps in a Google Play category", + "description": "Fetch top public apps in a Google Play category. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "googlePlay" + ], + "parameters": [ + { + "name": "category", + "in": "path", + "required": true, + "description": "Google Play category identifier (e.g. GAME, SHOPPING).", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of results; values outside 1..50 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 50 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googleplay/data_safety/{id}": { + "get": { + "operationId": "googlePlayDataSafety", + "summary": "Fetch a Google Play app's declared data-safety disclosure", + "description": "Fetch a Google Play app's declared data-safety disclosure. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "googlePlay" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "Google Play package id (e.g. com.nike.snkrs).", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googleplay/developer": { + "get": { + "operationId": "googlePlayDeveloper", + "summary": "Fetch public apps published by a Google Play developer", + "description": "Fetch public apps published by a Google Play developer. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "googlePlay" + ], + "parameters": [ + { + "name": "dev_id", + "in": "query", + "required": true, + "description": "Google Play developer id.", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of results; values outside 1..50 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 50 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googleplay/permissions/{id}": { + "get": { + "operationId": "googlePlayPermissions", + "summary": "Fetch a Google Play app's declared permissions", + "description": "Fetch a Google Play app's declared permissions. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "googlePlay" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "Google Play package id (e.g. com.nike.snkrs).", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googleplay/reviews/{id}": { + "get": { + "operationId": "googlePlayReviews", + "summary": "Fetch public reviews for a Google Play app", + "description": "Fetch public reviews for a Google Play app. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "googlePlay" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "Google Play package id (e.g. com.nike.snkrs).", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of results; values outside 1..50 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 50 + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "description": "Upstream review sort order.", + "schema": { + "type": "integer" + } + }, + { + "name": "score", + "in": "query", + "required": false, + "description": "Filter reviews to this star rating (1..5).", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 5 + } + }, + { + "name": "next_token", + "in": "query", + "required": false, + "description": "Pagination token from a previous reviews response.", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googleplay/search": { + "get": { + "operationId": "googlePlaySearch", + "summary": "Search public Google Play applications by term", + "description": "Search public Google Play applications by term. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "googlePlay" + ], + "parameters": [ + { + "name": "term", + "in": "query", + "required": true, + "description": "Search term.", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of results; values outside 1..50 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 50 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googleplay/similar_apps/{id}": { + "get": { + "operationId": "googlePlaySimilarApps", + "summary": "Fetch apps similar to a given Google Play package", + "description": "Fetch apps similar to a given Google Play package. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "googlePlay" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "Google Play package id (e.g. com.nike.snkrs).", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of results; values outside 1..50 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 50 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googleplay/suggest": { + "get": { + "operationId": "googlePlaySuggest", + "summary": "Fetch Google Play search-term suggestions", + "description": "Fetch Google Play search-term suggestions. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "googlePlay" + ], + "parameters": [ + { + "name": "term", + "in": "query", + "required": true, + "description": "Search term.", + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "description": "Two-letter storefront code.", + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "required": false, + "description": "Language code.", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of results; values outside 1..50 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 50 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googleshopping/product_offers": { + "get": { + "operationId": "googleShoppingProductOffers", + "tags": [ + "googleShopping" + ], + "parameters": [ + { + "name": "product_id", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "text", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "lang", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "domain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/googleshopping/search": { + "get": { + "operationId": "googleShoppingSearch", + "tags": [ + "googleShopping" + ], + "parameters": [ + { + "name": "text", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "lang", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "country", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "domain", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "start", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/hackernews/item/{id}": { + "get": { + "operationId": "hackerNewsItem", + "summary": "Fetch a single Hacker News item and its comment tree", + "description": "Fetch a single Hacker News item and its comment tree. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "hackerNews" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "description": "Hacker News item id.", + "schema": { + "type": "integer" + } + }, + { + "name": "depth", + "in": "query", + "required": false, + "description": "Maximum comment-tree depth to resolve; values outside 1..10 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 10 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/hackernews/search": { + "get": { + "operationId": "hackerNewsSearch", + "summary": "Search Hacker News via Algolia", + "description": "Search Hacker News via Algolia. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "hackerNews" + ], + "parameters": [ + { + "name": "q", + "in": "query", + "required": true, + "description": "Search query.", + "schema": { + "type": "string" + } + }, + { + "name": "tags", + "in": "query", + "required": false, + "description": "Algolia HN Search tag filter (e.g. story, comment, ask_hn).", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of results; values outside 1..100 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "page", + "in": "query", + "required": false, + "description": "Result page.", + "schema": { + "type": "integer", + "minimum": 0 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/hackernews/stories_ask": { + "get": { + "operationId": "hackerNewsStoriesAsk", + "summary": "Fetch current Ask HN stories", + "description": "Fetch current Ask HN stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "hackerNews" + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of results; values outside 1..100 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "page", + "in": "query", + "required": false, + "description": "Result page.", + "schema": { + "type": "integer", + "minimum": 1 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/hackernews/stories_best": { + "get": { + "operationId": "hackerNewsStoriesBest", + "summary": "Fetch current Hacker News best stories", + "description": "Fetch current Hacker News best stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "hackerNews" + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of results; values outside 1..100 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "page", + "in": "query", + "required": false, + "description": "Result page.", + "schema": { + "type": "integer", + "minimum": 1 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/hackernews/stories_job": { + "get": { + "operationId": "hackerNewsStoriesJob", + "summary": "Fetch current Hacker News job postings", + "description": "Fetch current Hacker News job postings. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "hackerNews" + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of results; values outside 1..100 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "page", + "in": "query", + "required": false, + "description": "Result page.", + "schema": { + "type": "integer", + "minimum": 1 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/hackernews/stories_new": { + "get": { + "operationId": "hackerNewsStoriesNew", + "summary": "Fetch current Hacker News new stories", + "description": "Fetch current Hacker News new stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "hackerNews" + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of results; values outside 1..100 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "page", + "in": "query", + "required": false, + "description": "Result page.", + "schema": { + "type": "integer", + "minimum": 1 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/hackernews/stories_show": { + "get": { + "operationId": "hackerNewsStoriesShow", + "summary": "Fetch current Show HN stories", + "description": "Fetch current Show HN stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "hackerNews" + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of results; values outside 1..100 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "page", + "in": "query", + "required": false, + "description": "Result page.", + "schema": { + "type": "integer", + "minimum": 1 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/hackernews/stories_top": { + "get": { + "operationId": "hackerNewsStoriesTop", + "summary": "Fetch current Hacker News top stories", + "description": "Fetch current Hacker News top stories. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "hackerNews" + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "description": "Maximum number of results; values outside 1..100 are rejected.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "page", + "in": "query", + "required": false, + "description": "Result page.", + "schema": { + "type": "integer", + "minimum": 1 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/hackernews/user/{handle}": { + "get": { + "operationId": "hackerNewsUser", + "summary": "Fetch a public Hacker News user profile", + "description": "Fetch a public Hacker News user profile. Returns the normalized public contract; raw provider records are internal to the runtime boundary and never cross the public gateway.", + "tags": [ + "hackerNews" + ], + "parameters": [ + { + "name": "handle", + "in": "path", + "required": true, + "description": "Hacker News username.", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/instagram/posts": { + "get": { + "operationId": "instagramPosts", + "tags": [ + "instagram" + ], + "parameters": [ + { + "name": "username", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/instagram/profile": { + "get": { + "operationId": "instagramProfile", + "tags": [ + "instagram" + ], + "parameters": [ + { + "name": "username", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/reddit/post_by_id/{id}": { + "get": { + "operationId": "redditPostById", + "tags": [ + "reddit" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "context", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/reddit/post_by_permalink": { + "get": { + "operationId": "redditPostByPermalink", + "tags": [ + "reddit" + ], + "parameters": [ + { + "name": "permalink", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "context", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/reddit/search_posts": { + "get": { + "operationId": "redditSearch", + "tags": [ + "reddit" + ], + "parameters": [ + { + "name": "query", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "time_filter", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/reddit/subreddit_posts/{subreddit}": { + "get": { + "operationId": "redditSubredditPosts", + "tags": [ + "reddit" + ], + "parameters": [ + { + "name": "subreddit", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "category", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "time_filter", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/reddit/user_activity/{username}": { + "get": { + "operationId": "redditUserActivity", + "tags": [ + "reddit" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/reddit/user_posts/{username}": { + "get": { + "operationId": "redditUserPosts", + "tags": [ + "reddit" + ], + "parameters": [ + { + "name": "username", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "category", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "time_filter", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/tiktok/post/{id}": { + "get": { + "operationId": "tiktokPost", + "tags": [ + "tiktok" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/tiktok/user/{handle}": { + "get": { + "operationId": "tiktokUser", + "tags": [ + "tiktok" + ], + "parameters": [ + { + "name": "handle", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/tiktok/user_posts/{handle}": { + "get": { + "operationId": "tiktokUserPosts", + "tags": [ + "tiktok" + ], + "parameters": [ + { + "name": "handle", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "count", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/web/search": { + "get": { + "operationId": "googleSearch", + "tags": [ + "google" + ], + "parameters": [ + { + "name": "text", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "engines", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "lang", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "region", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "date", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "site", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "start", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 100 + } + }, + { + "name": "cursor", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/webcontext/brand": { + "get": { + "operationId": "webBrand", + "summary": "Extract public brand identity for a site", + "description": "Extract logos, colors, fonts, and basic public metadata for a site's brand identity.", + "tags": [ + "web" + ], + "parameters": [ + { + "name": "url", + "in": "query", + "required": true, + "description": "Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address.", + "schema": { + "type": "string", + "format": "uri" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/webcontext/crawl": { + "get": { + "operationId": "webCrawl", + "summary": "Crawl same-origin links from a URL", + "description": "Crawl same-origin links starting from a URL and return normalized page results. max_pages/max_depth are clamped server-side regardless of the requested value.", + "tags": [ + "web" + ], + "parameters": [ + { + "name": "url", + "in": "query", + "required": true, + "description": "Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address.", + "schema": { + "type": "string", + "format": "uri" + } + }, + { + "name": "max_pages", + "in": "query", + "required": false, + "description": "Maximum pages to crawl; clamped to 1..50.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 50 + } + }, + { + "name": "max_depth", + "in": "query", + "required": false, + "description": "Maximum link depth; clamped to 1..3.", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 3 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/webcontext/map": { + "get": { + "operationId": "webMap", + "summary": "Discover URLs belonging to a site", + "description": "Discover URLs belonging to a site without extracting page content. Results are deduplicated.", + "tags": [ + "web" + ], + "parameters": [ + { + "name": "url", + "in": "query", + "required": true, + "description": "Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address.", + "schema": { + "type": "string", + "format": "uri" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/webcontext/scrape": { + "get": { + "operationId": "webScrape", + "summary": "Fetch one URL as clean Markdown", + "description": "Fetch one URL and return clean, main-content Markdown plus normalized metadata, links, and images. Backed by a privately deployed webclaw-server instance; upstream implementation details are never exposed.", + "tags": [ + "web" + ], + "parameters": [ + { + "name": "url", + "in": "query", + "required": true, + "description": "Target URL to fetch. Rejected if it is malformed, uses a disallowed scheme, or resolves to a private/loopback/link-local/cloud-metadata address.", + "schema": { + "type": "string", + "format": "uri" + } + }, + { + "name": "include_selectors", + "in": "query", + "required": false, + "description": "Comma-separated CSS selectors to include (e.g. \"article,.content\").", + "schema": { + "type": "string" + } + }, + { + "name": "exclude_selectors", + "in": "query", + "required": false, + "description": "Comma-separated CSS selectors to exclude (e.g. \"nav,.sidebar,footer\").", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/youtube/channel/{id}": { + "get": { + "operationId": "youtubeChannel", + "tags": [ + "youtube" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/youtube/comments/{id}": { + "get": { + "operationId": "youtubeComments", + "tags": [ + "youtube" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 50 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/youtube/playlist/{id}": { + "get": { + "operationId": "youtubePlaylist", + "tags": [ + "youtube" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/youtube/related/{id}": { + "get": { + "operationId": "youtubeRelated", + "tags": [ + "youtube" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/youtube/search": { + "get": { + "operationId": "youtubeSearch", + "tags": [ + "youtube" + ], + "parameters": [ + { + "name": "term", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "limit", + "in": "query", + "schema": { + "type": "integer", + "minimum": 1, + "maximum": 50 + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/youtube/transcript/{id}": { + "get": { + "operationId": "youtubeTranscript", + "tags": [ + "youtube" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + }, + "/v1/youtube/video/{id}": { + "get": { + "operationId": "youtubeVideo", + "tags": [ + "youtube" + ], + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "language", + "in": "query", + "schema": { + "type": "string" + } + } + ], + "security": [ + { + "bearerAuth": [] + } + ], + "responses": { + "200": { + "description": "Normalized ReplyNodes read response", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SuccessResponse" + } + } + } + }, + "400": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "401": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "403": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "404": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "405": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "413": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "429": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "500": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "502": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "503": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "504": { + "description": "Standard ReplyNodes error envelope", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ErrorResponse" + } + } + } + }, + "402": { + "description": "x402 challenge or prepaid-credit top-up required", + "headers": { + "X-Request-Id": { + "$ref": "#/components/headers/X-Request-Id" + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PaymentRequiredResponse" + } + } + } + } + } + } + } + } +} diff --git a/replynodes.gemspec b/replynodes.gemspec new file mode 100644 index 0000000..9979325 --- /dev/null +++ b/replynodes.gemspec @@ -0,0 +1,26 @@ +# frozen_string_literal: true + +require_relative "lib/replynodes/version" + +Gem::Specification.new do |spec| + spec.name = "replynodes" + spec.version = ReplyNodes::VERSION + spec.authors = ["ReplyNodes"] + spec.email = ["support@replynodes.com"] + spec.summary = "ReplyNodes Ruby SDK" + spec.description = "Ruby client for the authenticated, read-only ReplyNodes API." + spec.homepage = "https://replynodes.com" + spec.license = "MIT" + spec.required_ruby_version = ">= 3.0" + + spec.metadata["homepage_uri"] = spec.homepage + spec.metadata["source_code_uri"] = "https://github.com/replynodes/replynodes-ruby" + spec.metadata["bug_tracker_uri"] = "https://github.com/replynodes/replynodes-ruby/issues" + + spec.files = Dir["lib/**/*.rb", "README.md", "LICENSE"].sort + spec.require_paths = ["lib"] + + spec.add_runtime_dependency "faraday", ">= 2.0", "< 3.0" + spec.add_runtime_dependency "faraday-multipart", ">= 1.0" + spec.add_runtime_dependency "marcel", ">= 1.0" +end diff --git a/scripts/check_generation.sh b/scripts/check_generation.sh new file mode 100755 index 0000000..9fd7f7c --- /dev/null +++ b/scripts/check_generation.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +tmp_dir="$(mktemp -d "${repo_root}/.generation-check.XXXXXX")" +trap 'rm -rf "${tmp_dir}"' EXIT + +"${repo_root}/scripts/generate" >/dev/null +cp -R "${repo_root}/lib/replynodes/generated" "${tmp_dir}/generated-first" +cp "${repo_root}/lib/replynodes/generated.rb" "${tmp_dir}/generated.rb-first" +cp "${repo_root}/lib/replynodes/operation_registry.rb" "${tmp_dir}/registry-first" + +"${repo_root}/scripts/generate" >/dev/null +diff -ruN "${tmp_dir}/generated-first" "${repo_root}/lib/replynodes/generated" +diff -u "${tmp_dir}/generated.rb-first" "${repo_root}/lib/replynodes/generated.rb" +diff -u "${tmp_dir}/registry-first" "${repo_root}/lib/replynodes/operation_registry.rb" +echo "generation drift check passed" diff --git a/scripts/check_surface.rb b/scripts/check_surface.rb new file mode 100755 index 0000000..c8894e3 --- /dev/null +++ b/scripts/check_surface.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +require "json" +require "set" + +ROOT = File.expand_path("..", __dir__) +spec = JSON.parse(File.read(File.join(ROOT, "openapi/replynodes-fetcher.openapi.json"))) +$LOAD_PATH.unshift(File.join(ROOT, "lib")) +require "replynodes" + +def snake(value) + value.gsub(/([a-z0-9])([A-Z])/, '\\1_\\2').tr("-", "_").downcase.to_sym +end + +canonical = {} +spec.fetch("paths").each do |path, path_item| + operation = path_item["get"] + next unless operation + + key = snake(operation.fetch("operationId")) + canonical[key] = { + operation_id: operation.fetch("operationId"), + path: path, + parameters: operation.fetch("parameters", []).map do |parameter| + { + name: snake(parameter.fetch("name")), + wire_name: parameter.fetch("name"), + location: parameter.fetch("in").to_sym, + required: parameter.fetch("required", false) + } + end + } +end + +registry = ReplyNodes::OPERATIONS +abort "registry operation coverage mismatch" unless registry.keys.to_set == canonical.keys.to_set +abort "public operation count mismatch" unless registry.size == canonical.size + +registry.each do |name, entry| + expected = canonical.fetch(name) + %i[operation_id path].each do |field| + abort "#{name}: #{field} mismatch" unless entry.fetch(field) == expected.fetch(field) + end + abort "#{name}: parameter contract mismatch" unless entry.fetch(:parameters) == expected.fetch(:parameters) + + api_class = ReplyNodesGenerated.const_get(entry.fetch(:api_class)) + generated_method = entry.fetch(:generated_method) + abort "#{name}: generated method missing" unless api_class.public_instance_methods.include?(generated_method) + abort "#{name}: public method missing" unless ReplyNodes::Client.public_instance_methods.include?(name) +end + +ReplyNodes::ALIASES.each do |alias_name, target| + abort "alias target missing: #{target}" unless registry.key?(target) + abort "alias collides with operation: #{alias_name}" if registry.key?(alias_name) + abort "alias method missing: #{alias_name}" unless ReplyNodes::Client.public_instance_methods.include?(alias_name) +end + +abort "non-GET operation leaked into registry" unless registry.values.all? { |entry| entry[:parameters].all? { |parameter| %i[path query].include?(parameter[:location]) } } +puts "surface check passed: #{canonical.size} canonical GET operations, #{ReplyNodes::ALIASES.size} intentional aliases" diff --git a/scripts/generate b/scripts/generate new file mode 100755 index 0000000..cd5c7af --- /dev/null +++ b/scripts/generate @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +generator_image="openapitools/openapi-generator-cli:v7.10.0" +output_dir="${repo_root}/lib/replynodes/generated" +scratch_dir="$(mktemp -d "${repo_root}/.openapi-generator.XXXXXX")" +trap 'rm -rf "${scratch_dir}"' EXIT + +rm -rf "${output_dir}" +mkdir -p "${output_dir}" + +docker run --rm \ + --user "$(id -u):$(id -g)" \ + -v "${repo_root}:/local" \ + "${generator_image}" generate \ + -i /local/openapi/replynodes-fetcher.openapi.json \ + -g ruby \ + -o "/local/${scratch_dir#${repo_root}/}" \ + -c /local/config/openapi-generator.json \ + --ignore-file-override /local/config/.openapi-generator-ignore \ + --global-property apiTests=false,modelTests=false,apiDocs=false,modelDocs=false + +# Keep only the generated Ruby library. The generated gemspec, README, build +# files, and generator metadata remain outside the published gem tree. +cp -R "${scratch_dir}/lib/replynodes" "${output_dir}/" +cp "${scratch_dir}/lib/replynodes.rb" "${repo_root}/lib/replynodes/generated.rb" +python3 "${repo_root}/scripts/generate_registry.py" diff --git a/scripts/generate_registry.py b/scripts/generate_registry.py new file mode 100755 index 0000000..e4735a2 --- /dev/null +++ b/scripts/generate_registry.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +"""Build the public operation registry from the canonical OpenAPI document.""" + +import json +import re +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +SPEC = ROOT / "openapi" / "replynodes-fetcher.openapi.json" +DEST = ROOT / "lib" / "replynodes" / "operation_registry.rb" + + +def snake(value): + value = re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", value) + return value.replace("-", "_").lower() + + +def camel(value): + return "".join(part[:1].upper() + part[1:] for part in re.split(r"(?=[A-Z])", value) if part) + + +def ruby_literal(value): + return json.dumps(value, ensure_ascii=False) + + +document = json.loads(SPEC.read_text()) +operations = [] +for path, path_item in document["paths"].items(): + operation = path_item.get("get") + if operation is None: + continue + params = [] + for parameter in operation.get("parameters", []): + name = parameter["name"] + params.append( + { + "name": snake(name), + "wire_name": name, + "location": parameter["in"], + "required": parameter.get("required", False), + } + ) + tag = operation["tags"][0] + operation_name = snake(operation["operationId"]) + operations.append( + { + "name": operation_name, + "operation_id": operation["operationId"], + "path": path, + "api_class": f"{camel(tag)}Api", + "generated_method": operation_name, + "parameters": params, + } + ) + +operations.sort(key=lambda item: item["name"]) +lines = [ + "# frozen_string_literal: true", + "", + "# This file is generated by scripts/generate_registry.py from the canonical", + "# ReplyNodes Fetcher OpenAPI contract. Do not hand-edit it.", + "module ReplyNodes", + " OPERATIONS = {", +] +for operation in operations: + lines.append(f" {operation['name']}: {{") + lines.append(f" operation_id: {ruby_literal(operation['operation_id'])},") + lines.append(f" path: {ruby_literal(operation['path'])},") + lines.append(f" api_class: {ruby_literal(operation['api_class'])},") + lines.append(f" generated_method: :{operation['generated_method']},") + lines.append(" parameters: [") + for parameter in operation["parameters"]: + required = "true" if parameter["required"] else "false" + lines.append( + " { name: :%s, wire_name: %s, location: :%s, required: %s }," + % ( + parameter["name"], + ruby_literal(parameter["wire_name"]), + parameter["location"], + required, + ) + ) + lines.append(" ].freeze") + lines.append(" }.freeze,") +lines.extend([ + " }.freeze", + " ALIASES = {}.freeze", + "end", + "", +]) +DEST.write_text("\n".join(lines)) diff --git a/test/client_test.rb b/test/client_test.rb new file mode 100644 index 0000000..c78942b --- /dev/null +++ b/test/client_test.rb @@ -0,0 +1,113 @@ +# frozen_string_literal: true + +require_relative "test_helper" + +class ClientTest < Minitest::Test + def test_auth_path_query_encoding_and_envelope + server = FakeServer.new(body: { data: { "ok" => true }, meta: { request_id: "req-auth" } }) + client = ReplyNodes::Client.new(api_key: "test-token", base_url: server.url) + + response = client.google_search(text: "cats & dogs", engines: "google,bing", start: 1) + + assert_equal true, response.data[:ok] + assert_equal "req-auth", response.request_id + assert_equal 200, response.status + request = wait_for_request(server) + assert_match(%r{GET /v1/web/search\?}, request[:line]) + assert_includes request[:line], "text=cats+%26+dogs" + assert_includes request[:line], "engines=google%2Cbing" + assert_includes request[:line], "start=1" + assert_equal "Bearer test-token", request[:headers]["Authorization"] + ensure + server&.stop + end + + def test_false_and_zero_optional_values_are_present + server = FakeServer.new(body: { data: {}, meta: { request_id: "req-values" } }) + client = ReplyNodes::Client.new(api_key: "test-token", base_url: server.url) + + client.app_store_app(id: "42", ratings: false) + client.hacker_news_search(q: "ruby", page: 0) + + request = wait_for_request(server) + assert_includes request[:line], "id=42" + assert_includes request[:line], "ratings=false" + 100.times { break if server.requests.length == 2; sleep 0.01 } + assert_includes server.requests[1][:line], "page=0" + ensure + server&.stop + end + + def test_http_error_contains_status_code_message_and_request_id + server = FakeServer.new( + status: 429, + headers: { "X-Request-Id" => "header-request" }, + body: { error: { code: "rate_limited", message: "slow down", request_id: "req-error" } } + ) + client = ReplyNodes::Client.new(api_key: "test-token", base_url: server.url) + + error = assert_raises(ReplyNodes::Error) { client.app_store_app } + + assert_equal 429, error.status + assert_equal "rate_limited", error.code + assert_equal "req-error", error.request_id + assert_includes error.message, "slow down" + assert_includes error.to_s, "status=429" + ensure + server&.stop + end + + def test_timeout_is_reported_and_a_503_is_not_retried + server = FakeServer.new(status: 503, body: { error: { code: "unavailable", message: "try later", request_id: "req-503" } }) + client = ReplyNodes::Client.new(api_key: "test-token", base_url: server.url, timeout: 1) + + begin + error = assert_raises(ReplyNodes::Error) { client.app_store_app } + + assert_equal 503, error.status + sleep 0.05 + assert_equal 1, server.requests.length + ensure + server.stop + end + + timeout_server = FakeServer.new(body: { data: {}, meta: { request_id: "never" } }, delay: 0.5) + timeout_client = ReplyNodes::Client.new(api_key: "test-token", base_url: timeout_server.url, timeout: 0.05) + begin + timeout_error = assert_raises(ReplyNodes::Error) { timeout_client.app_store_app } + assert_nil timeout_error.status + assert_equal "timeout", timeout_error.code + ensure + timeout_server.stop + end + end + + def test_pagination_helpers_read_the_response_data + server = FakeServer.new( + body: { + data: { items: [], pagination: { next_cursor: "cursor-2", has_more: true } }, + meta: { request_id: "req-page" } + } + ) + client = ReplyNodes::Client.new(api_key: "test-token", base_url: server.url) + + response = client.web_map(url: "https://example.com") + + assert_equal "cursor-2", response.next_cursor + assert response.has_more? + assert_equal({ next_cursor: "cursor-2", has_more: true }, response.pagination) + ensure + server&.stop + end + + private + + def wait_for_request(server) + 100.times do + return server.requests.first if server.requests.any? + + sleep 0.01 + end + flunk "fake server did not receive a request" + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..038d720 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,70 @@ +# frozen_string_literal: true + +require "json" +require "socket" +require "minitest/autorun" +require "replynodes" + +class FakeServer + attr_reader :requests, :port + + def initialize(status: 200, body: {}, headers: {}, delay: 0) + @status = status + @body = body.is_a?(String) ? body : JSON.generate(body) + @headers = { "Content-Type" => "application/json" }.merge(headers) + @delay = delay + @requests = [] + @running = true + @server = TCPServer.new("127.0.0.1", 0) + @port = @server.addr[1] + @thread = Thread.new { serve } + end + + def url + "http://127.0.0.1:#{port}" + end + + def stop + @running = false + TCPSocket.new("127.0.0.1", port).close + rescue Errno::ECONNREFUSED + nil + ensure + @thread.join(2) + @server.close unless @server.closed? + end + + private + + def serve + while @running + begin + socket = @server.accept + request_line = socket.gets + request_headers = {} + while (line = socket.gets) + break if line == "\r\n" + + key, value = line.split(":", 2) + request_headers[key] = value.to_s.strip + end + @requests << { line: request_line.to_s, headers: request_headers } + sleep @delay if @delay.positive? + write_response(socket) if socket + socket.close + rescue IOError, Errno::EBADF, Errno::ECONNRESET + break + end + end + end + + def write_response(socket) + status_text = @status == 200 ? "OK" : "Error" + response_headers = @headers.merge("Content-Length" => @body.bytesize, "Connection" => "close") + socket.write("HTTP/1.1 #{@status} #{status_text}\r\n") + response_headers.each { |key, value| socket.write("#{key}: #{value}\r\n") } + socket.write("\r\n#{@body}") + rescue IOError, Errno::EPIPE, Errno::ECONNRESET + nil + end +end