├── .rspec ├── lib ├── proz │ ├── version.rb │ ├── delete_wiwo_entry.rb │ ├── get_single_public_wiwo_entry.rb │ ├── get_single_wiwo_entry.rb │ ├── patch_wiwo_entry.rb │ ├── delete_wiwo_reply.rb │ ├── post_wiwo_entry.rb │ ├── post_wiwo_reply.rb │ ├── patch_wiwo_reply.rb │ ├── get_wiwo_entry.rb │ ├── profile.rb │ ├── freelancer.rb │ ├── freelancer_matches.rb │ ├── wiwo_entries.rb │ └── oauth.rb └── proz.rb ├── .travis.yml ├── Rakefile ├── Gemfile ├── .gitignore ├── spec ├── spec_helper.rb ├── fixtures │ └── vcr_cassettes │ │ ├── freelancer_matches_no_results.yml │ │ ├── invalid_uuid.yml │ │ ├── invalid_key.yml │ │ ├── freelancer_matches_invalid_key.yml │ │ ├── profile_query_invalid_access_token.yml │ │ ├── profile_query_access_token_expired.yml │ │ ├── refresh_token.yml │ │ ├── exchange_code_for_token.yml │ │ ├── exchange_code_for_token_invalid_code.yml │ │ ├── profile_query.yml │ │ ├── freelancer.yml │ │ ├── match_query.yml │ │ └── match_query_options.yml └── proz │ ├── freelancer_matches_spec.rb │ ├── profile_spec.rb │ ├── oauth_spec.rb │ └── freelancer_spec.rb ├── LICENSE.txt ├── proz.gemspec └── README.md /.rspec: -------------------------------------------------------------------------------- 1 | --color -------------------------------------------------------------------------------- /lib/proz/version.rb: -------------------------------------------------------------------------------- 1 | module Proz 2 | VERSION = "2.1.4" 3 | end 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: ruby 2 | rvm: 3 | - "2.1.5" 4 | - "2.2.0" 5 | - "2.3.1" -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | require 'bundler/gem_tasks' 2 | require 'rspec/core/rake_task' 3 | RSpec::Core::RakeTask.new(:spec) 4 | task :default => :spec -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | gem 'codeclimate-test-reporter', group: :test, require: nil 3 | # Specify your gem's dependencies in proz.gemspec 4 | gemspec 5 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.bundle/ 2 | /.yardoc 3 | /Gemfile.lock 4 | /_yardoc/ 5 | /coverage/ 6 | /doc/ 7 | /pkg/ 8 | /spec/reports/ 9 | /tmp/ 10 | *.bundle 11 | *.so 12 | *.o 13 | *.a 14 | mkmf.log 15 | -------------------------------------------------------------------------------- /spec/spec_helper.rb: -------------------------------------------------------------------------------- 1 | require 'proz' 2 | require 'webmock/rspec' 3 | require 'vcr' 4 | VCR.configure do |config| 5 | config.cassette_library_dir = "spec/fixtures/vcr_cassettes" 6 | config.hook_into :webmock 7 | end -------------------------------------------------------------------------------- /lib/proz/delete_wiwo_entry.rb: -------------------------------------------------------------------------------- 1 | require 'httparty' 2 | 3 | module Proz 4 | class DeleteWiwoEntry 5 | include HTTParty 6 | base_uri "https://api.proz.com/v2" 7 | attr_reader :token, :wiwo_id 8 | def initialize(token:, wiwo_id:) 9 | @token = token 10 | @wiwo_id = wiwo_id 11 | end 12 | 13 | def delete 14 | self.class.delete("/wiwo/#{wiwo_id}", headers: { 'Authorization' => "Bearer #{token}" } ) 15 | end 16 | end 17 | end -------------------------------------------------------------------------------- /lib/proz/get_single_public_wiwo_entry.rb: -------------------------------------------------------------------------------- 1 | require 'httparty' 2 | 3 | module Proz 4 | class GetSinglePublicWiwoEntry 5 | include HTTParty 6 | base_uri "https://api.proz.com/v2" 7 | attr_reader :key, :wiwo_id 8 | def initialize(key:, wiwo_id:) 9 | @key = key 10 | @wiwo_id = wiwo_id 11 | end 12 | 13 | def get 14 | self.class.get("/wiwo/#{wiwo_id}", headers: { 'X-Proz-API-Key' => "#{key}" } ) 15 | end 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /lib/proz/get_single_wiwo_entry.rb: -------------------------------------------------------------------------------- 1 | require 'httparty' 2 | 3 | module Proz 4 | class GetSingleWiwoEntry 5 | include HTTParty 6 | base_uri "https://api.proz.com/v2" 7 | attr_reader :token, :wiwo_id 8 | def initialize(token:, wiwo_id:) 9 | @token = token 10 | @wiwo_id = wiwo_id 11 | end 12 | 13 | def get 14 | self.class.get("/wiwo/#{wiwo_id}", headers: { 'Authorization' => "Bearer #{token}" } ) 15 | end 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /lib/proz.rb: -------------------------------------------------------------------------------- 1 | require "proz/version" 2 | require "proz/oauth" 3 | require "proz/profile" 4 | require "proz/freelancer" 5 | require "proz/freelancer_matches" 6 | require "proz/post_wiwo_entry" 7 | require "proz/get_wiwo_entry" 8 | require "proz/wiwo_entries" 9 | require "proz/post_wiwo_reply" 10 | require "proz/delete_wiwo_entry" 11 | require "proz/delete_wiwo_reply" 12 | require "proz/patch_wiwo_entry" 13 | require "proz/patch_wiwo_reply" 14 | require "proz/get_single_wiwo_entry" 15 | require "proz/get_single_public_wiwo_entry" -------------------------------------------------------------------------------- /lib/proz/patch_wiwo_entry.rb: -------------------------------------------------------------------------------- 1 | require 'httparty' 2 | 3 | module Proz 4 | class PatchWiwoEntry 5 | include HTTParty 6 | base_uri "https://api.proz.com/v2" 7 | attr_reader :token, :wiwo_id, :options 8 | def initialize(token:, wiwo_id:, **options) 9 | @token = token 10 | @wiwo_id = wiwo_id 11 | @options = options 12 | end 13 | 14 | def patch 15 | self.class.patch("/wiwo/#{wiwo_id}", 16 | body: options, 17 | headers: { 'Authorization' => "Bearer #{token}" } ) 18 | end 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /lib/proz/delete_wiwo_reply.rb: -------------------------------------------------------------------------------- 1 | require 'httparty' 2 | 3 | module Proz 4 | class DeleteWiwoReply 5 | include HTTParty 6 | base_uri "https://api.proz.com/v2" 7 | attr_reader :token, :wiwo_id, :wiwo_reply_id 8 | def initialize(token:, wiwo_id:, wiwo_reply_id:) 9 | @token = token 10 | @wiwo_id = wiwo_id 11 | @wiwo_reply_id = wiwo_reply_id 12 | end 13 | 14 | def delete 15 | self.class.delete("/wiwo/#{wiwo_id}/replies/#{wiwo_reply_id}", headers: { 'Authorization' => "Bearer #{token}" } ) 16 | end 17 | end 18 | end -------------------------------------------------------------------------------- /lib/proz/post_wiwo_entry.rb: -------------------------------------------------------------------------------- 1 | require 'httparty' 2 | 3 | module Proz 4 | class PostWiwoEntry 5 | include HTTParty 6 | base_uri "https://api.proz.com/v2" 7 | attr_reader :token, :message, :options 8 | def initialize(token:, message:, **options) 9 | @token = token 10 | @message = { message: message } 11 | @options = options 12 | end 13 | 14 | def post 15 | body = message.merge!(options) 16 | self.class.post("/wiwo", 17 | body: body, 18 | headers: { 'Authorization' => "Bearer #{token}" } ) 19 | end 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /lib/proz/post_wiwo_reply.rb: -------------------------------------------------------------------------------- 1 | require 'httparty' 2 | 3 | module Proz 4 | class PostWiwoReply 5 | include HTTParty 6 | base_uri "https://api.proz.com/v2" 7 | attr_reader :token, :id, :message, :options 8 | def initialize(token:, id:, message:, **options) 9 | @token = token 10 | @id = id 11 | @message = { message: message } 12 | @options = options 13 | end 14 | 15 | def post 16 | body = message.merge!(options) 17 | self.class.post("/wiwo/#{id}/replies", 18 | body: body, 19 | headers: { 'Authorization' => "Bearer #{token}" } ) 20 | end 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /lib/proz/patch_wiwo_reply.rb: -------------------------------------------------------------------------------- 1 | require 'httparty' 2 | 3 | module Proz 4 | class PatchWiwoReply 5 | include HTTParty 6 | base_uri "https://api.proz.com/v2" 7 | attr_reader :token, :wiwo_id, :wiwo_reply_id, :options 8 | def initialize(token:, wiwo_id:, wiwo_reply_id:, **options) 9 | @token = token 10 | @wiwo_id = wiwo_id 11 | @wiwo_reply_id = wiwo_reply_id 12 | @options = options 13 | end 14 | 15 | def patch 16 | self.class.patch("/wiwo/#{wiwo_id}/replies/#{wiwo_reply_id}", 17 | body: options, 18 | headers: { 'Authorization' => "Bearer #{token}" } ) 19 | end 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /lib/proz/get_wiwo_entry.rb: -------------------------------------------------------------------------------- 1 | require 'httparty' 2 | 3 | module Proz 4 | class GetWiwoEntry 5 | include HTTParty 6 | base_uri "https://api.proz.com/v2" 7 | attr_reader :token, :user_uuid, :include_private 8 | def initialize(token:, user_uuid:, include_private:) 9 | @token = token 10 | @include_private = include_private 11 | @user_uuid = user_uuid 12 | end 13 | 14 | def get 15 | if include_private 16 | self.class.get("/wiwo?user_uuid=" + user_uuid + "&include_private=1", 17 | headers: { 'Authorization' => "Bearer #{token}" } ) 18 | else 19 | self.class.get("/wiwo?user_uuid=" + user_uuid, 20 | headers: { 'Authorization' => "Bearer #{token}" } ) 21 | end 22 | end 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/freelancer_matches_no_results.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.proz.com/v2/freelancer-matches?country_code=us&language_pair=eng_esl&min_yrs_proz=50 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | X-Proz-Api-Key: 11 | - xxxxxxxxx 12 | response: 13 | status: 14 | code: 200 15 | message: OK 16 | headers: 17 | Date: 18 | - Wed, 04 Feb 2015 08:12:24 GMT 19 | Server: 20 | - Apache 21 | Cache-Control: 22 | - no-cache 23 | Transfer-Encoding: 24 | - chunked 25 | Content-Type: 26 | - application/json 27 | body: 28 | encoding: UTF-8 29 | string: '{"success":1,"meta":{"num_results":0},"data":[]}' 30 | http_version: 31 | recorded_at: Wed, 04 Feb 2015 08:12:56 GMT 32 | recorded_with: VCR 2.9.3 33 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/invalid_uuid.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.proz.com/v2/freelancer/xxxxx 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | X-Proz-Api-Key: 11 | - xxxxxxxxx 12 | response: 13 | status: 14 | code: 400 15 | message: Bad Request 16 | headers: 17 | Date: 18 | - Wed, 04 Feb 2015 07:12:07 GMT 19 | Server: 20 | - Apache 21 | Cache-Control: 22 | - no-cache 23 | Connection: 24 | - close 25 | Transfer-Encoding: 26 | - chunked 27 | Content-Type: 28 | - application/json 29 | body: 30 | encoding: UTF-8 31 | string: '{"success":0,"error_messages":["No freelancer was found with that UUID."]}' 32 | http_version: 33 | recorded_at: Wed, 04 Feb 2015 07:12:38 GMT 34 | recorded_with: VCR 2.9.3 35 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/invalid_key.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.proz.com/v2/freelancer/663e4488-58a1-4713-992c-c6d90aafa3cb 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | X-Proz-Api-Key: 11 | - yyyyyyyyy 12 | response: 13 | status: 14 | code: 401 15 | message: Unauthorized 16 | headers: 17 | Date: 18 | - Wed, 04 Feb 2015 06:49:20 GMT 19 | Server: 20 | - Apache 21 | Cache-Control: 22 | - no-store 23 | Content-Length: 24 | - '116' 25 | Content-Type: 26 | - application/json 27 | body: 28 | encoding: UTF-8 29 | string: '{"error":"invalid_api_key","error_description":"Invalid API key.","error_messages":["Invalid 30 | API key."],"success":0}' 31 | http_version: 32 | recorded_at: Wed, 04 Feb 2015 06:49:51 GMT 33 | recorded_with: VCR 2.9.3 34 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/freelancer_matches_invalid_key.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.proz.com/v2/freelancer-matches?country_code=us&language_pair=eng_esl&min_yrs_proz=10 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | X-Proz-Api-Key: 11 | - yyyyyyyyy 12 | response: 13 | status: 14 | code: 401 15 | message: Unauthorized 16 | headers: 17 | Date: 18 | - Wed, 04 Feb 2015 07:43:47 GMT 19 | Server: 20 | - Apache 21 | Cache-Control: 22 | - no-store 23 | Content-Length: 24 | - '116' 25 | Content-Type: 26 | - application/json 27 | body: 28 | encoding: UTF-8 29 | string: '{"error":"invalid_api_key","error_description":"Invalid API key.","error_messages":["Invalid 30 | API key."],"success":0}' 31 | http_version: 32 | recorded_at: Wed, 04 Feb 2015 07:44:18 GMT 33 | recorded_with: VCR 2.9.3 34 | -------------------------------------------------------------------------------- /lib/proz/profile.rb: -------------------------------------------------------------------------------- 1 | require 'httparty' 2 | 3 | module Proz 4 | class Profile 5 | include HTTParty 6 | base_uri "https://api.proz.com/v2" 7 | attr_reader :token 8 | def initialize(token:) 9 | @token = token 10 | end 11 | 12 | def profile 13 | case 14 | when profile_response.has_key?('error') 15 | if profile_response['error'].eql?('invalid_token') 16 | raise 'Invalid Token' 17 | elsif profile_response['error'].eql?('expired_token') 18 | raise 'Access Token Expired' 19 | else 20 | raise 'Invalid Request' 21 | end 22 | else 23 | profile_response['data'] 24 | end 25 | end 26 | 27 | def method_missing(name, *args, &block) 28 | profile.has_key?(name.to_s) ? profile[name.to_s] : super 29 | end 30 | 31 | private 32 | 33 | def profile_response 34 | @profile ||= self.class.get("/freelancer/me", headers: { 'Authorization' => "Bearer #{token}" }) 35 | end 36 | end 37 | end 38 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/profile_query_invalid_access_token.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.proz.com/v2/freelancer/me 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | Authorization: 11 | - Bearer q76470e1fb5e5c0347c3a7393f6312fd980096ae 12 | response: 13 | status: 14 | code: 401 15 | message: Unauthorized 16 | headers: 17 | Date: 18 | - Wed, 04 Feb 2015 08:19:59 GMT 19 | Server: 20 | - Apache 21 | Cache-Control: 22 | - no-store 23 | Www-Authenticate: 24 | - Bearer realm="Service", error="invalid_token", error_description="The access 25 | token provided is invalid" 26 | Content-Length: 27 | - '84' 28 | Content-Type: 29 | - application/json 30 | body: 31 | encoding: UTF-8 32 | string: '{"error":"invalid_token","error_description":"The access token provided 33 | is invalid"}' 34 | http_version: 35 | recorded_at: Wed, 04 Feb 2015 08:20:30 GMT 36 | recorded_with: VCR 2.9.3 37 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/profile_query_access_token_expired.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.proz.com/v2/freelancer/me 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | Authorization: 11 | - Bearer 4b89e678e8670bca496c9bd80d8b09b87c10d605 12 | response: 13 | status: 14 | code: 401 15 | message: Unauthorized 16 | headers: 17 | Date: 18 | - Wed, 04 Feb 2015 08:23:11 GMT 19 | Server: 20 | - Apache 21 | Cache-Control: 22 | - no-store 23 | Www-Authenticate: 24 | - Bearer realm="Service", error="expired_token", error_description="The access 25 | token provided has expired" 26 | Content-Length: 27 | - '85' 28 | Content-Type: 29 | - application/json 30 | body: 31 | encoding: UTF-8 32 | string: '{"error":"expired_token","error_description":"The access token provided 33 | has expired"}' 34 | http_version: 35 | recorded_at: Wed, 04 Feb 2015 08:23:42 GMT 36 | recorded_with: VCR 2.9.3 37 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 Kevin S. Dias 2 | 3 | MIT License 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | "Software"), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /lib/proz/freelancer.rb: -------------------------------------------------------------------------------- 1 | require 'httparty' 2 | 3 | module Proz 4 | class Freelancer 5 | include HTTParty 6 | base_uri 'https://api.proz.com/v2' 7 | attr_reader :key, :uuid 8 | def initialize(key:, uuid:) 9 | @key = key 10 | @uuid = uuid 11 | end 12 | 13 | def freelancer 14 | case 15 | when freelancer_response.has_key?('error') 16 | if freelancer_response['error'].eql?('invalid_api_key') 17 | raise 'Invalid API Key' 18 | else 19 | raise 'Invalid Request' 20 | end 21 | when freelancer_response.has_key?('error_messages') 22 | if freelancer_response['error_messages'][0].eql?('No freelancer was found with that UUID.') 23 | raise 'No freelancer was found with that UUID' 24 | else 25 | raise 'Invalid Request' 26 | end 27 | else 28 | freelancer_response['data'] 29 | end 30 | end 31 | 32 | def method_missing(name, *args, &block) 33 | freelancer.has_key?(name.to_s) ? freelancer[name.to_s] : super 34 | end 35 | 36 | private 37 | 38 | def freelancer_response 39 | @freelancer_response ||= self.class.get("/freelancer/#{uuid}", headers: { 'X-Proz-API-Key' => key}) 40 | end 41 | end 42 | end 43 | -------------------------------------------------------------------------------- /proz.gemspec: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | lib = File.expand_path('../lib', __FILE__) 3 | $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 4 | require 'proz/version' 5 | 6 | Gem::Specification.new do |spec| 7 | spec.name = "proz" 8 | spec.version = Proz::VERSION 9 | spec.authors = ["Kevin S. Dias"] 10 | spec.email = ["diasks2@gmail.com"] 11 | spec.summary = %q{Ruby wrapper for the ProZ.com API} 12 | spec.description = %q{A Ruby wrapper for working with the ProZ.com 2.0 API, a REST-like API for interacting with ProZ.com services.} 13 | spec.homepage = "" 14 | spec.license = "MIT" 15 | 16 | spec.files = `git ls-files -z`.split("\x0") 17 | spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } 18 | spec.test_files = spec.files.grep(%r{^(test|spec|features)/}) 19 | spec.require_paths = ["lib"] 20 | 21 | spec.add_development_dependency "bundler", "~> 1.7" 22 | spec.add_development_dependency "rake", "~> 10.0" 23 | spec.add_development_dependency "rack", "1.6.4" 24 | spec.add_development_dependency "vcr" 25 | spec.add_development_dependency "webmock" 26 | spec.add_development_dependency "rspec", "3.4.0" 27 | spec.add_runtime_dependency "httparty" 28 | spec.add_runtime_dependency "oauth2" 29 | end 30 | -------------------------------------------------------------------------------- /lib/proz/freelancer_matches.rb: -------------------------------------------------------------------------------- 1 | require 'httparty' 2 | 3 | module Proz 4 | class FreelancerMatches 5 | include HTTParty 6 | base_uri 'https://api.proz.com/v2' 7 | attr_reader :key, :language_pair, :options 8 | def initialize(key:, language_pair:, **options) 9 | @key = key 10 | @language_pair = { language_pair: language_pair } 11 | @options = options 12 | end 13 | 14 | def freelancer_matches 15 | case 16 | when freelancer_matches_response.has_key?('error') 17 | if freelancer_matches_response['error'].eql?('invalid_api_key') 18 | raise 'Invalid API Key' 19 | else 20 | raise 'Invalid Request' 21 | end 22 | when freelancer_matches_response.has_key?('meta') 23 | if freelancer_matches_response['meta']['num_results'].eql?(0) 24 | {} 25 | else 26 | freelancer_matches_response['data'] 27 | end 28 | else 29 | freelancer_matches_response['data'] 30 | end 31 | end 32 | 33 | private 34 | 35 | def freelancer_matches_response 36 | all_options = language_pair.merge!(options) 37 | @freelancer_matches_response ||= self.class.get("/freelancer-matches", query: all_options, headers: { 'X-Proz-API-Key' => key}) 38 | end 39 | end 40 | end 41 | -------------------------------------------------------------------------------- /lib/proz/wiwo_entries.rb: -------------------------------------------------------------------------------- 1 | require 'httparty' 2 | require 'uri' 3 | 4 | module Proz 5 | class WiwoEntries 6 | include HTTParty 7 | base_uri "https://api.proz.com/v2" 8 | attr_reader :key 9 | def initialize(key:) 10 | @key = key 11 | end 12 | 13 | def entries 14 | all_wiwos 15 | end 16 | 17 | def wiwos 18 | all_wiwos["wiwos"] 19 | end 20 | 21 | def users 22 | all_wiwos["users"] 23 | end 24 | 25 | def filtered_entries(**options) 26 | if options[:user_uuid] 27 | user_uuid_query = "user_uuid=" + options[:user_uuid] + '&' 28 | else 29 | user_uuid_query = "" 30 | end 31 | if options[:keyword] 32 | keyword_query = "message_contains=" + URI.encode(options[:keyword], /\W/) + '&' 33 | else 34 | keyword_query = "" 35 | end 36 | if options[:min_time] 37 | min_time_query = "min_time=" + URI.encode(options[:min_time]) + '&' 38 | else 39 | min_time_query = "" 40 | end 41 | self.class.get("/wiwo?" + user_uuid_query + keyword_query + min_time_query, headers: { 'X-Proz-API-Key' => key }) 42 | end 43 | 44 | private 45 | 46 | def all_wiwos 47 | @wiwos ||= self.class.get("/wiwo", headers: { 'X-Proz-API-Key' => key }) 48 | end 49 | end 50 | end 51 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/refresh_token.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: post 5 | uri: https://www.proz.com/oauth/token 6 | body: 7 | encoding: UTF-8 8 | string: refresh_token=x92701ac20cb02a5742f2a0288b7a9f6a6d0b265&redirect_uri=http%3A%2F%2Fwww.example.com&client_id=xxxxxxxxx&scope=&client_secret=yyyyyyyyy&grant_type=refresh_token 9 | headers: 10 | Accept-Encoding: 11 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 12 | Accept: 13 | - "*/*" 14 | User-Agent: 15 | - Ruby 16 | response: 17 | status: 18 | code: 200 19 | message: OK 20 | headers: 21 | Date: 22 | - Wed, 04 Feb 2015 03:54:54 GMT 23 | Server: 24 | - Apache 25 | Set-Cookie: 26 | - PHPSESSID=255168990f895321641e3236da9715bd; expires=Fri, 03-Feb-2017 03:54:54 27 | GMT; path=/; domain=.proz.com 28 | Expires: 29 | - Thu, 19 Nov 1981 08:52:00 GMT 30 | Cache-Control: 31 | - no-store 32 | Pragma: 33 | - no-cache 34 | Vary: 35 | - Accept-Encoding 36 | Content-Length: 37 | - '152' 38 | Content-Type: 39 | - application/json 40 | body: 41 | encoding: UTF-8 42 | string: '{"access_token":"x325fa5d0a661df967a6c52d07ba352649a7c153","expires_in":3600,"token_type":"Bearer","scope":"proz","refresh_token":"x6ee311617f0f0520e99de13b07ee61c03777134"}' 43 | http_version: 44 | recorded_at: Wed, 04 Feb 2015 03:55:24 GMT 45 | recorded_with: VCR 2.9.3 46 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/exchange_code_for_token.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: post 5 | uri: https://www.proz.com/oauth/token 6 | body: 7 | encoding: UTF-8 8 | string: code=xf505e6ac620cb51bb8dc99d4bddbef2f3122e70&redirect_uri=http%3A%2F%2Fwww.example.com&client_id=xxxxxxxxx&scope=&client_secret=yyyyyyyyy&grant_type=authorization_code 9 | headers: 10 | Accept-Encoding: 11 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 12 | Accept: 13 | - "*/*" 14 | User-Agent: 15 | - Ruby 16 | response: 17 | status: 18 | code: 200 19 | message: OK 20 | headers: 21 | Date: 22 | - Wed, 04 Feb 2015 03:30:40 GMT 23 | Server: 24 | - Apache 25 | Set-Cookie: 26 | - PHPSESSID=17ec0c5cba276c880ed65dbfb0491638; expires=Fri, 03-Feb-2017 03:30:40 27 | GMT; path=/; domain=.proz.com 28 | Expires: 29 | - Thu, 19 Nov 1981 08:52:00 GMT 30 | Cache-Control: 31 | - no-store 32 | Pragma: 33 | - no-cache 34 | Vary: 35 | - Accept-Encoding 36 | Content-Length: 37 | - '152' 38 | Content-Type: 39 | - application/json 40 | body: 41 | encoding: UTF-8 42 | string: '{"access_token":"q0245b8b893717386310160f117d1720583f3d22","expires_in":3600,"token_type":"Bearer","scope":"proz","refresh_token":"g197d8ba9dd0c608ee6e2c83c3b363540ec14b31"}' 43 | http_version: 44 | recorded_at: Wed, 04 Feb 2015 03:31:09 GMT 45 | recorded_with: VCR 2.9.3 46 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/exchange_code_for_token_invalid_code.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: post 5 | uri: https://www.proz.com/oauth/token 6 | body: 7 | encoding: UTF-8 8 | string: code=xf505e6ac620cb51bb8dc99d4bddbef2f3122e70&redirect_uri=http%3A%2F%2Fwww.example.com&client_id=xxxxxxxxx&scope=&client_secret=yyyyyyyyy&grant_type=authorization_code 9 | headers: 10 | Accept-Encoding: 11 | - gzip;q=1.0,deflate;q=0.6,identity;q=0.3 12 | Accept: 13 | - "*/*" 14 | User-Agent: 15 | - Ruby 16 | response: 17 | status: 18 | code: 400 19 | message: Bad Request 20 | headers: 21 | Date: 22 | - Wed, 04 Feb 2015 08:27:48 GMT 23 | Server: 24 | - Apache 25 | Set-Cookie: 26 | - PHPSESSID=78683f88050679d8f1a0b981396b749c; expires=Fri, 03-Feb-2017 08:27:48 27 | GMT; path=/; domain=.proz.com 28 | Expires: 29 | - Thu, 19 Nov 1981 08:52:00 GMT 30 | Cache-Control: 31 | - no-store 32 | Pragma: 33 | - no-cache 34 | Vary: 35 | - Accept-Encoding 36 | Content-Length: 37 | - '107' 38 | Connection: 39 | - close 40 | Content-Type: 41 | - application/json 42 | body: 43 | encoding: UTF-8 44 | string: '{"error":"invalid_grant","error_description":"Authorization code doesn''t 45 | exist or is invalid for the client"}' 46 | http_version: 47 | recorded_at: Wed, 04 Feb 2015 08:28:19 GMT 48 | recorded_with: VCR 2.9.3 49 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/profile_query.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.proz.com/v2/freelancer/me 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | Authorization: 11 | - Bearer q76470e1fb5e5c0347c3a7393f6312fd980096ae 12 | response: 13 | status: 14 | code: 200 15 | message: OK 16 | headers: 17 | Date: 18 | - Wed, 04 Feb 2015 04:05:36 GMT 19 | Server: 20 | - Apache 21 | Cache-Control: 22 | - no-cache 23 | Transfer-Encoding: 24 | - chunked 25 | Content-Type: 26 | - application/json 27 | body: 28 | encoding: UTF-8 29 | string: '{"success":1,"meta":null,"data":{"uuid":"7bbfdd74-a2a4-484f-8dbc-215a67026ce1","site_name":"Kevin 30 | Dias","profile_url":"http:\/\/www.proz.com\/profile\/1979687","contact_info":{"first_name":"Kevin","middle_name":null,"last_name":"Dias"},"skills":{"language_pairs":[],"general_disciplines":[{"disc_gen_id":1,"disc_gen_name":"Tech\/Engineering"},{"disc_gen_id":2,"disc_gen_name":"Art\/Literary"},{"disc_gen_id":3,"disc_gen_name":"Medical"},{"disc_gen_id":4,"disc_gen_name":"Law\/Patents"},{"disc_gen_id":5,"disc_gen_name":"Science"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":7,"disc_gen_name":"Marketing"},{"disc_gen_id":8,"disc_gen_name":"Other"},{"disc_gen_id":9,"disc_gen_name":"Social 31 | Sciences"}],"specific_disciplines":[]}}}' 32 | http_version: 33 | recorded_at: Wed, 04 Feb 2015 04:06:06 GMT 34 | recorded_with: VCR 2.9.3 35 | -------------------------------------------------------------------------------- /lib/proz/oauth.rb: -------------------------------------------------------------------------------- 1 | require 'oauth2' 2 | require 'httparty' 3 | 4 | module Proz 5 | class OAuth 6 | include HTTParty 7 | attr_reader :client_id, :client_secret, :redirect_uri 8 | def initialize(client_id:, client_secret:, redirect_uri:) 9 | @client_id = client_id 10 | @client_secret = client_secret 11 | @redirect_uri = redirect_uri 12 | end 13 | 14 | def link 15 | client.auth_code.authorize_url(:redirect_uri => redirect_uri) 16 | end 17 | 18 | def exchange_code_for_token(code) 19 | if token(code).has_key?('error') 20 | if token(code)['error'].eql?('invalid_grant') 21 | raise "Authorization code doesn't exist or is invalid for the client" 22 | else 23 | raise 'Invalid Request' 24 | end 25 | else 26 | token(code) 27 | end 28 | end 29 | 30 | def request_new_token_with_refresh_token(refresh_token) 31 | @refreshed_token ||= self.class.post('https://www.proz.com/oauth/token', :body => { :refresh_token => refresh_token, :redirect_uri => redirect_uri, :client_id => client_id, :client_secret => client_secret, :grant_type => 'refresh_token' }) 32 | end 33 | 34 | private 35 | 36 | def token(code) 37 | @token ||= self.class.post('https://www.proz.com/oauth/token', :body => { :code => code, :redirect_uri => redirect_uri, :client_id => client_id, :client_secret => client_secret, :grant_type => 'authorization_code' }) 38 | end 39 | 40 | def client 41 | @client ||= OAuth2::Client.new(client_id, client_secret, :site => 'https://www.proz.com') 42 | end 43 | end 44 | end 45 | -------------------------------------------------------------------------------- /spec/proz/freelancer_matches_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | RSpec.describe Proz::FreelancerMatches do 4 | 5 | it 'must have the base url set to the ProZ API endpoint' do 6 | expect(Proz::FreelancerMatches.base_uri).to eq('https://api.proz.com/v2') 7 | end 8 | 9 | it 'returns a freelancer match query' do 10 | VCR.use_cassette 'match_query' do 11 | fm = Proz::FreelancerMatches.new(key: 'xxxxxxxxx', language_pair: 'eng_esl') 12 | expect(fm.freelancer_matches.size).to eq(10) 13 | end 14 | end 15 | 16 | it 'returns a freelancer match query' do 17 | VCR.use_cassette 'match_query' do 18 | fm = Proz::FreelancerMatches.new(key: 'xxxxxxxxx', language_pair: 'eng_esl') 19 | expect(fm.freelancer_matches[0]['freelancer']['uuid']).to eq('663e4488-58a1-4713-992c-c6d90aafa3cb') 20 | end 21 | end 22 | 23 | it 'returns a freelancer match query with options specified' do 24 | VCR.use_cassette 'match_query_options' do 25 | fm = Proz::FreelancerMatches.new(key: 'xxxxxxxxx', language_pair: 'eng_esl', min_yrs_proz: 10, country_code: 'us') 26 | expect(fm.freelancer_matches[0]['freelancer']['uuid']).to eq('b9eade6d-33ac-4c7d-b6f1-42905375fc0b') 27 | end 28 | end 29 | 30 | it 'returns an error if the key is invalid' do 31 | VCR.use_cassette 'freelancer_matches_invalid_key' do 32 | fm = Proz::FreelancerMatches.new(key: 'yyyyyyyyy', language_pair: 'eng_esl', min_yrs_proz: 10, country_code: 'us') 33 | expect { fm.freelancer_matches }.to raise_error("Invalid API Key") 34 | end 35 | end 36 | 37 | it 'returns an empty hash if the query has no results' do 38 | VCR.use_cassette 'freelancer_matches_no_results' do 39 | fm = Proz::FreelancerMatches.new(key: 'xxxxxxxxx', language_pair: 'eng_esl', min_yrs_proz: 50, country_code: 'us') 40 | expect(fm.freelancer_matches).to eq({}) 41 | end 42 | end 43 | end 44 | -------------------------------------------------------------------------------- /spec/proz/profile_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | RSpec.describe Proz::Profile do 4 | 5 | it 'should return the full profile of a user given an access token' do 6 | VCR.use_cassette 'profile_query' do 7 | profile = Proz::Profile.new(token: 'q76470e1fb5e5c0347c3a7393f6312fd980096ae') 8 | expect(profile.profile).to eq({"uuid"=>"7bbfdd74-a2a4-484f-8dbc-215a67026ce1", "site_name"=>"Kevin Dias", "profile_url"=>"http://www.proz.com/profile/1979687", "contact_info"=>{"first_name"=>"Kevin", "middle_name"=>nil, "last_name"=>"Dias"}, "skills"=>{"language_pairs"=>[], "general_disciplines"=>[{"disc_gen_id"=>1, "disc_gen_name"=>"Tech/Engineering"}, {"disc_gen_id"=>2, "disc_gen_name"=>"Art/Literary"}, {"disc_gen_id"=>3, "disc_gen_name"=>"Medical"}, {"disc_gen_id"=>4, "disc_gen_name"=>"Law/Patents"}, {"disc_gen_id"=>5, "disc_gen_name"=>"Science"}, {"disc_gen_id"=>6, "disc_gen_name"=>"Bus/Financial"}, {"disc_gen_id"=>7, "disc_gen_name"=>"Marketing"}, {"disc_gen_id"=>8, "disc_gen_name"=>"Other"}, {"disc_gen_id"=>9, "disc_gen_name"=>"Social Sciences"}], "specific_disciplines"=>[]}}) 9 | end 10 | end 11 | 12 | it 'should return the uuid of a user given an access token' do 13 | VCR.use_cassette 'profile_query' do 14 | profile = Proz::Profile.new(token: 'q76470e1fb5e5c0347c3a7393f6312fd980096ae') 15 | expect(profile.uuid).to eq('7bbfdd74-a2a4-484f-8dbc-215a67026ce1') 16 | end 17 | end 18 | 19 | it 'should return the site_name of a user given an access token' do 20 | VCR.use_cassette 'profile_query' do 21 | profile = Proz::Profile.new(token: 'q76470e1fb5e5c0347c3a7393f6312fd980096ae') 22 | expect(profile.site_name).to eq('Kevin Dias') 23 | end 24 | end 25 | 26 | it 'should return the profile_url of a user given an access token' do 27 | VCR.use_cassette 'profile_query' do 28 | profile = Proz::Profile.new(token: 'q76470e1fb5e5c0347c3a7393f6312fd980096ae') 29 | expect(profile.profile_url).to eq('http://www.proz.com/profile/1979687') 30 | end 31 | end 32 | 33 | it 'should return an error is the access token is invalid' do 34 | VCR.use_cassette 'profile_query_invalid_access_token' do 35 | profile = Proz::Profile.new(token: 'q76470e1fb5e5c0347c3a7393f6312fd980096ae') 36 | expect { profile.profile_url }.to raise_error('Invalid Token') 37 | end 38 | end 39 | 40 | it 'should return an error is the access token is expired' do 41 | VCR.use_cassette 'profile_query_access_token_expired' do 42 | profile = Proz::Profile.new(token: '4b89e678e8670bca496c9bd80d8b09b87c10d605') 43 | expect { profile.profile_url }.to raise_error('Access Token Expired') 44 | end 45 | end 46 | end -------------------------------------------------------------------------------- /spec/proz/oauth_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | RSpec.describe Proz::OAuth do 4 | 5 | it 'sets the client_id' do 6 | oauth2 = Proz::OAuth.new(client_id: 'abcdef', client_secret: 'xyz123', redirect_uri: 'https://www.example.com') 7 | expect(oauth2.client_id).to eq('abcdef') 8 | end 9 | 10 | it 'sets the client_secret' do 11 | oauth2 = Proz::OAuth.new(client_id: 'abcdef', client_secret: 'xyz123', redirect_uri: 'https://www.example.com') 12 | expect(oauth2.client_secret).to eq('xyz123') 13 | end 14 | 15 | it 'sets the redirect_uri' do 16 | oauth2 = Proz::OAuth.new(client_id: 'abcdef', client_secret: 'xyz123', redirect_uri: 'https://www.example.com') 17 | expect(oauth2.redirect_uri).to eq('https://www.example.com') 18 | end 19 | 20 | it 'returns a link for the user to authorize the app' do 21 | proz = Proz::OAuth.new(client_id: 'abc123xxxxxxxxxxxxxx', client_secret: 'abc123xxxxyyyyy', redirect_uri: 'http://www.example.com') 22 | expect(proz.link).to eq("https://www.proz.com/oauth/authorize?client_id=abc123xxxxxxxxxxxxxx&redirect_uri=http%3A%2F%2Fwww.example.com&response_type=code") 23 | end 24 | 25 | it 'exchanges a code for an access token' do 26 | VCR.use_cassette 'exchange_code_for_token' do 27 | proz = Proz::OAuth.new(client_id: 'xxxxxxxxx', client_secret: 'yyyyyyyyy', redirect_uri: 'http://www.example.com') 28 | expect(proz.exchange_code_for_token('xf505e6ac620cb51bb8dc99d4bddbef2f3122e70')['access_token']).to eq('q0245b8b893717386310160f117d1720583f3d22') 29 | expect(proz.exchange_code_for_token('xf505e6ac620cb51bb8dc99d4bddbef2f3122e70')['refresh_token']).to eq('g197d8ba9dd0c608ee6e2c83c3b363540ec14b31') 30 | end 31 | end 32 | 33 | it 'requests a new token with the refresh token' do 34 | VCR.use_cassette 'refresh_token' do 35 | proz = Proz::OAuth.new(client_id: 'xxxxxxxxx', client_secret: 'yyyyyyyyy', redirect_uri: 'http://www.example.com') 36 | expect(proz.request_new_token_with_refresh_token('x92701ac20cb02a5742f2a0288b7a9f6a6d0b265')['access_token']).to eq('x325fa5d0a661df967a6c52d07ba352649a7c153') 37 | expect(proz.request_new_token_with_refresh_token('x92701ac20cb02a5742f2a0288b7a9f6a6d0b265')['refresh_token']).to eq('x6ee311617f0f0520e99de13b07ee61c03777134') 38 | end 39 | end 40 | 41 | it 'requests an error if the code is invalid' do 42 | VCR.use_cassette 'exchange_code_for_token_invalid_code' do 43 | proz = Proz::OAuth.new(client_id: 'xxxxxxxxx', client_secret: 'yyyyyyyyy', redirect_uri: 'http://www.example.com') 44 | expect { proz.exchange_code_for_token('xf505e6ac620cb51bb8dc99d4bddbef2f3122e70') }.to raise_error("Authorization code doesn't exist or is invalid for the client") 45 | end 46 | end 47 | end 48 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/freelancer.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.proz.com/v2/freelancer/663e4488-58a1-4713-992c-c6d90aafa3cb 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | X-Proz-Api-Key: 11 | - xxxxxxxxx 12 | response: 13 | status: 14 | code: 200 15 | message: OK 16 | headers: 17 | Date: 18 | - Wed, 04 Feb 2015 03:03:59 GMT 19 | Server: 20 | - Apache 21 | Cache-Control: 22 | - no-cache 23 | Transfer-Encoding: 24 | - chunked 25 | Content-Type: 26 | - application/json 27 | body: 28 | encoding: UTF-8 29 | string: '{"success":1,"meta":null,"data":{"uuid":"663e4488-58a1-4713-992c-c6d90aafa3cb","site_name":"Smartranslators","profile_url":"http:\/\/www.proz.com\/profile\/76374","contact_info":{},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 30 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 31 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"},{"service_id":8,"service_name":"Interpreting, 32 | Chuchotage\/Whispering"}]},{"pair_code":"esl_eng","pair_name":"Spanish to 33 | English","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]},{"pair_code":"fra_esl","pair_name":"French 34 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]}],"general_disciplines":[{"disc_gen_id":1,"disc_gen_name":"Tech\/Engineering"},{"disc_gen_id":4,"disc_gen_name":"Law\/Patents"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":7,"disc_gen_name":"Marketing"},{"disc_gen_id":8,"disc_gen_name":"Other"}],"specific_disciplines":[{"disc_spec_id":159,"disc_spec_name":"Automation 35 | \u0026 Robotics","expertise_level":"specialty"},{"disc_spec_id":32,"disc_spec_name":"Economics","expertise_level":"specialty"},{"disc_spec_id":26,"disc_spec_name":"Construction 36 | \/ Civil Engineering","expertise_level":"specialty"},{"disc_spec_id":25,"disc_spec_name":"Computers: 37 | Systems, Networks","expertise_level":"specialty"},{"disc_spec_id":24,"disc_spec_name":"Computers: 38 | Software","expertise_level":"specialty"},{"disc_spec_id":23,"disc_spec_name":"Computers: 39 | Hardware","expertise_level":"specialty"},{"disc_spec_id":77,"disc_spec_name":"Law 40 | (general)","expertise_level":"specialty"},{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 41 | (general)","expertise_level":"specialty"},{"disc_spec_id":147,"disc_spec_name":"Computers 42 | (general)","expertise_level":"specialty"},{"disc_spec_id":48,"disc_spec_name":"Finance 43 | (general)","expertise_level":"specialty"},{"disc_spec_id":68,"disc_spec_name":"IT 44 | (Information Technology)","expertise_level":"working"},{"disc_spec_id":75,"disc_spec_name":"Law: 45 | Contract(s)","expertise_level":"working"},{"disc_spec_id":1,"disc_spec_name":"Accounting","expertise_level":"working"},{"disc_spec_id":6,"disc_spec_name":"Architecture","expertise_level":"working"},{"disc_spec_id":34,"disc_spec_name":"Electronics 46 | \/ Elect Eng","expertise_level":"working"}]}}}' 47 | http_version: 48 | recorded_at: Wed, 04 Feb 2015 03:04:28 GMT 49 | recorded_with: VCR 2.9.3 50 | -------------------------------------------------------------------------------- /spec/proz/freelancer_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | RSpec.describe Proz::Freelancer do 4 | 5 | it 'must have the base url set to the ProZ API endpoint' do 6 | expect(Proz::Freelancer.base_uri).to eq('https://api.proz.com/v2') 7 | end 8 | 9 | it 'returns an error if the key is invalid' do 10 | VCR.use_cassette 'invalid_key' do 11 | freelancer = Proz::Freelancer.new(key: 'yyyyyyyyy', uuid: '663e4488-58a1-4713-992c-c6d90aafa3cb') 12 | expect { freelancer.freelancer }.to raise_error('Invalid API Key') 13 | end 14 | end 15 | 16 | it 'returns a freelancer' do 17 | VCR.use_cassette 'freelancer' do 18 | freelancer = Proz::Freelancer.new(key: 'xxxxxxxxxx', uuid: '663e4488-58a1-4713-992c-c6d90aafa3cb') 19 | expect(freelancer.freelancer).to eq({"uuid"=>"663e4488-58a1-4713-992c-c6d90aafa3cb", "site_name"=>"Smartranslators", "profile_url"=>"http://www.proz.com/profile/76374", "contact_info"=>{}, "skills"=>{"language_pairs"=>[{"pair_code"=>"eng_esl", "pair_name"=>"English to Spanish", "services"=>[{"service_id"=>1, "service_name"=>"Translation"}, {"service_id"=>2, "service_name"=>"Checking/editing"}, {"service_id"=>3, "service_name"=>"Interpreting, Consecutive"}, {"service_id"=>4, "service_name"=>"Interpreting, Simultaneous"}, {"service_id"=>5, "service_name"=>"Voiceover"}, {"service_id"=>6, "service_name"=>"Summarization"}, {"service_id"=>7, "service_name"=>"Education"}, {"service_id"=>8, "service_name"=>"Interpreting, Chuchotage/Whispering"}]}, {"pair_code"=>"esl_eng", "pair_name"=>"Spanish to English", "services"=>[{"service_id"=>1, "service_name"=>"Translation"}, {"service_id"=>2, "service_name"=>"Checking/editing"}]}, {"pair_code"=>"fra_esl", "pair_name"=>"French to Spanish", "services"=>[{"service_id"=>1, "service_name"=>"Translation"}, {"service_id"=>2, "service_name"=>"Checking/editing"}]}], "general_disciplines"=>[{"disc_gen_id"=>1, "disc_gen_name"=>"Tech/Engineering"}, {"disc_gen_id"=>4, "disc_gen_name"=>"Law/Patents"}, {"disc_gen_id"=>6, "disc_gen_name"=>"Bus/Financial"}, {"disc_gen_id"=>7, "disc_gen_name"=>"Marketing"}, {"disc_gen_id"=>8, "disc_gen_name"=>"Other"}], "specific_disciplines"=>[{"disc_spec_id"=>159, "disc_spec_name"=>"Automation & Robotics", "expertise_level"=>"specialty"}, {"disc_spec_id"=>32, "disc_spec_name"=>"Economics", "expertise_level"=>"specialty"}, {"disc_spec_id"=>26, "disc_spec_name"=>"Construction / Civil Engineering", "expertise_level"=>"specialty"}, {"disc_spec_id"=>25, "disc_spec_name"=>"Computers: Systems, Networks", "expertise_level"=>"specialty"}, {"disc_spec_id"=>24, "disc_spec_name"=>"Computers: Software", "expertise_level"=>"specialty"}, {"disc_spec_id"=>23, "disc_spec_name"=>"Computers: Hardware", "expertise_level"=>"specialty"}, {"disc_spec_id"=>77, "disc_spec_name"=>"Law (general)", "expertise_level"=>"specialty"}, {"disc_spec_id"=>15, "disc_spec_name"=>"Business/Commerce (general)", "expertise_level"=>"specialty"}, {"disc_spec_id"=>147, "disc_spec_name"=>"Computers (general)", "expertise_level"=>"specialty"}, {"disc_spec_id"=>48, "disc_spec_name"=>"Finance (general)", "expertise_level"=>"specialty"}, {"disc_spec_id"=>68, "disc_spec_name"=>"IT (Information Technology)", "expertise_level"=>"working"}, {"disc_spec_id"=>75, "disc_spec_name"=>"Law: Contract(s)", "expertise_level"=>"working"}, {"disc_spec_id"=>1, "disc_spec_name"=>"Accounting", "expertise_level"=>"working"}, {"disc_spec_id"=>6, "disc_spec_name"=>"Architecture", "expertise_level"=>"working"}, {"disc_spec_id"=>34, "disc_spec_name"=>"Electronics / Elect Eng", "expertise_level"=>"working"}]}}) 20 | end 21 | end 22 | 23 | it 'returns an error if the uuid is invalid' do 24 | VCR.use_cassette 'invalid_uuid' do 25 | freelancer = Proz::Freelancer.new(key: 'xxxxxxxxx', uuid: 'xxxxx') 26 | expect { freelancer.site_name }.to raise_error("No freelancer was found with that UUID") 27 | end 28 | end 29 | 30 | it "returns a freelancer's uuid" do 31 | VCR.use_cassette 'freelancer' do 32 | freelancer = Proz::Freelancer.new(key: 'xxxxxxxxxx', uuid: '663e4488-58a1-4713-992c-c6d90aafa3cb') 33 | expect(freelancer.uuid).to eq('663e4488-58a1-4713-992c-c6d90aafa3cb') 34 | end 35 | end 36 | 37 | it "returns a freelancer's site_name" do 38 | VCR.use_cassette 'freelancer' do 39 | freelancer = Proz::Freelancer.new(key: 'xxxxxxxxxx', uuid: '663e4488-58a1-4713-992c-c6d90aafa3cb') 40 | expect(freelancer.site_name).to eq('Smartranslators') 41 | end 42 | end 43 | 44 | it "returns a freelancer's language_pairs" do 45 | VCR.use_cassette 'freelancer' do 46 | freelancer = Proz::Freelancer.new(key: 'xxxxxxxxxx', uuid: '663e4488-58a1-4713-992c-c6d90aafa3cb') 47 | expect(freelancer.skills['language_pairs']).to eq([{"pair_code"=>"eng_esl", "pair_name"=>"English to Spanish", "services"=>[{"service_id"=>1, "service_name"=>"Translation"}, {"service_id"=>2, "service_name"=>"Checking/editing"}, {"service_id"=>3, "service_name"=>"Interpreting, Consecutive"}, {"service_id"=>4, "service_name"=>"Interpreting, Simultaneous"}, {"service_id"=>5, "service_name"=>"Voiceover"}, {"service_id"=>6, "service_name"=>"Summarization"}, {"service_id"=>7, "service_name"=>"Education"}, {"service_id"=>8, "service_name"=>"Interpreting, Chuchotage/Whispering"}]}, {"pair_code"=>"esl_eng", "pair_name"=>"Spanish to English", "services"=>[{"service_id"=>1, "service_name"=>"Translation"}, {"service_id"=>2, "service_name"=>"Checking/editing"}]}, {"pair_code"=>"fra_esl", "pair_name"=>"French to Spanish", "services"=>[{"service_id"=>1, "service_name"=>"Translation"}, {"service_id"=>2, "service_name"=>"Checking/editing"}]}]) 48 | end 49 | end 50 | end 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ProZ 2 | 3 | [![Gem Version](https://badge.fury.io/rb/proz.svg)](http://badge.fury.io/rb/proz) [![Build Status](https://travis-ci.org/diasks2/proz.png)](https://travis-ci.org/diasks2/proz) [![License](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat)](https://github.com/diasks2/proz/blob/master/LICENSE.txt) 4 | 5 | ProZ is a Ruby wrapper for the [ProZ.com API](http://www.proz.com/api-docs). The ProZ.com 2.0 API is a REST-like API for interacting with ProZ.com services. 6 | 7 | ## Install 8 | 9 | **Ruby** 10 | *Supports Ruby 2.1.5 and above* 11 | ``` 12 | gem install proz 13 | ``` 14 | 15 | **Ruby on Rails** 16 | Add this line to your application’s Gemfile: 17 | ```ruby 18 | gem 'proz' 19 | ``` 20 | 21 | ## Usage 22 | 23 | ### Directory Service API 24 | 25 | #### Freelancer 26 | 27 | Get a representation of a single freelancer by providing that freelancer's [uuid](http://www.proz.com/api-docs/formats/uuid). The uuid is not provided publicly by ProZ so you have to obtain it either through the Freelancer Match API or the OAuth2 API. 28 | 29 | ```ruby 30 | freelancer = Proz::Freelancer.new(key: 'yourAPIkey', uuid: '663e4488-58a1-4713-992c-c6d90aafa3cb') 31 | freelancer.site_name 32 | # => 'Smartranslators' 33 | ``` 34 | 35 | **Supported Methods** 36 | * `uuid` 37 | * `site_name` 38 | * `profile_url` 39 | * `contact_info` 40 | * `skills` 41 | 42 | Further details for each method can be found in the [ProZ API Specification](http://www.proz.com/api-docs/types/freelancer). 43 | 44 | #### Freelancer Matches 45 | 46 | Get freelancers that match a set of criteria. A [language pair](http://www.proz.com/api-docs/formats/language-pair) is required for this query. The language pair code should be in the form of a source language code, an underscore, and a target language code. The language codes are a variation of an earlier version of the ISO 639-2 standard, so please check the [ProZ language code](http://www.proz.com/api-docs/codes/language) list to make sure you have the correct language code. 47 | 48 | You can pass any number of [optionial parameters](http://www.proz.com/api-docs/directory/get-freelancer-matches). The default number of freelancers returned is 10. 49 | 50 | ```ruby 51 | fm = Proz::FreelancerMatches.new(key: 'yourAPIkey', language_pair: 'eng_esl') 52 | fm.freelancer_matches[0]['freelancer']['uuid'] 53 | # => '663e4488-58a1-4713-992c-c6d90aafa3cb' 54 | 55 | fm = Proz::FreelancerMatches.new(key: 'yourAPIkey', language_pair: 'eng_esl', min_yrs_proz: 10, country_code: 'us') 56 | fm.freelancer_matches[0]['freelancer']['uuid'] 57 | # => 'b9eade6d-33ac-4c7d-b6f1-42905375fc0b' 58 | ``` 59 | 60 | #### WIWO (What I'm Working On) 61 | 62 | GET WIWO data 63 | 64 | Note that all referenced users are included in the response (using "side loading"). 65 | 66 | ```ruby 67 | wiwo = Proz::WiwoEntries.new(key: 'yourAPIkey') 68 | wiwo.entries 69 | 70 | # Filter the returned WIWOs 71 | # Options include: 72 | # * user_uuid (string) 73 | # * message_contains (string) 74 | # * min_time (datetime) 75 | 76 | options = { 77 | user_uuid: '7ccfee74-a2a4-484f-8dbc-215a67026ce1', 78 | message_contains: 'hello world', 79 | min_time: '2016-07-013T01:01:01+00:00' 80 | } 81 | wiwo.filtered_entries(options) 82 | ``` 83 | 84 | GET WIWO (OAuth2) 85 | 86 | ```ruby 87 | # Get user's WIWOs (public + private) 88 | Proz::GetWiwoEntry.new( 89 | token: 'access_token', 90 | user_uuid: '7ccfee74-a2a4-484f-8dbc-215a67026ce1', 91 | include_private: true 92 | ).get 93 | 94 | # Get user's WIWOs (public only) 95 | Proz::GetWiwoEntry.new( 96 | token: 'access_token', 97 | user_uuid: '7ccfee74-a2a4-484f-8dbc-215a67026ce1', 98 | include_private: false 99 | ).get 100 | 101 | ``` 102 | 103 | GET Single WIWO (OAuth2) 104 | 105 | ```ruby 106 | Proz::GetSingleWiwoEntry.new( 107 | token: 'access_token', 108 | wiwo_id: 'wiwo_id', 109 | ).get 110 | ``` 111 | 112 | GET Single Public WIWO (API Key) 113 | 114 | ```ruby 115 | Proz::GetSinglePublicWiwoEntry.new( 116 | key: 'key', 117 | wiwo_id: 'wiwo_id', 118 | ).get 119 | ``` 120 | 121 | POST WIWO 122 | 123 | Uses OAuth2 with the `wiwo` default scope. Use the [omniauth-proz](https://github.com/diasks2/omniauth-proz) gem to easily authenticate. 124 | 125 | Send a JSON object with the following fields. Only the "message" is required. 126 | * message (string) - a plain text message. 127 | * message_language (string) - a 3-character language code for the message. 128 | * source_language (string) - a 3-character language code for the source 129 | * target_language (string) 130 | * discipline (string) - a free-text discipline 131 | * wordcount (int) - the number of words completed 132 | * public (boolean) - whether or not the status update should be publicly visible. 133 | * cat_tool (string) - A free-text name of the CAT tool in use, if any. 134 | * percent_complete (int) - An integer from 0 - 100 describing the completion of the project the translator is working on. 135 | * busy_meter (int) - An integer from 1 - 5 describing how busy the translator is. 136 | * location (hash) 137 | - latitude (decimal) - Latitude location where the translator is sending the message from. 138 | - longitude (decimal) - Longitude location where the translator is sending the message from. 139 | - show_location (boolean) - Allow the submitted location to be shown in the status update. 140 | * representative_terms (array) - Up to 5 representative terms fron the source document the translator is working on. 141 | 142 | ``` 143 | Proz::PostWiwoEntry.new( 144 | token: 'access_token', 145 | message: "Hello World", 146 | source_language: "eng", 147 | target_language: "esp", 148 | wordcount: 500, 149 | discipline: "automotive", 150 | message_language: "eng", 151 | public: 1, 152 | cat_tool: "Awesome CAT", 153 | percent_complete: 95, 154 | busy_meter: 5, 155 | location: { 156 | latitude: 40.706872, 157 | longitude: -74.011254, 158 | show_location: 1 159 | }, 160 | representative_terms: ['term 1', 'term 2', 'term 3', 'term 4', 'term 5'] 161 | ).post 162 | ``` 163 | 164 | PATCH WIWO 165 | 166 | Uses OAuth2 with the `wiwo` default scope. Use the [omniauth-proz](https://github.com/diasks2/omniauth-proz) gem to easily authenticate. 167 | 168 | ``` 169 | Proz::PatchWiwoEntry.new( 170 | token: 'access_token', 171 | wiwo_id: 'wiwo_id', 172 | message: "Hello World", 173 | source_language: "eng", 174 | target_language: "esp", 175 | wordcount: 500, 176 | discipline: "automotive", 177 | message_language: "eng", 178 | public: 1, 179 | cat_tool: "Awesome CAT" 180 | ).patch 181 | ``` 182 | 183 | DELETE WIWO 184 | 185 | Uses OAuth2 with the `wiwo` default scope. Use the [omniauth-proz](https://github.com/diasks2/omniauth-proz) gem to easily authenticate. 186 | 187 | ```ruby 188 | Proz::DeleteWiwoEntry.new( 189 | token: 'access_token', 190 | wiwo_id: 'wiwo_id' 191 | ).delete 192 | ``` 193 | 194 | POST Reply 195 | 196 | Uses OAuth2 with the `wiwo` default scope. Use the [omniauth-proz](https://github.com/diasks2/omniauth-proz) gem to easily authenticate. 197 | 198 | Send a JSON object with the following fields. Only the "message" is required. 199 | * id (string) - id of the parent wiwo 200 | * message (string) - a plain text message. 201 | * message_language (string) - a 3-character language code for the message. 202 | 203 | ``` 204 | Proz::PostWiwoReply.new( 205 | id: '567', 206 | token: 'access_token', 207 | message: "Hello World", 208 | message_language: "eng" 209 | ).post 210 | ``` 211 | 212 | PATCH Reply 213 | 214 | Uses OAuth2 with the `wiwo` default scope. Use the [omniauth-proz](https://github.com/diasks2/omniauth-proz) gem to easily authenticate. 215 | 216 | ```ruby 217 | Proz::PatchWiwoReply.new( 218 | token: 'access_token', 219 | wiwo_id: 'wiwo_id' 220 | wiwo_reply_id: 'wiwo_reply_id', 221 | message: 'message', 222 | message_language: 'message_language' 223 | ).patch 224 | ``` 225 | 226 | DELETE Reply 227 | 228 | Uses OAuth2 with the `wiwo` default scope. Use the [omniauth-proz](https://github.com/diasks2/omniauth-proz) gem to easily authenticate. 229 | 230 | ```ruby 231 | Proz::DeleteWiwoReply.new( 232 | token: 'access_token', 233 | wiwo_id: 'wiwo_id' 234 | wiwo_reply_id: 'wiwo_reply_id' 235 | ).delete 236 | ``` 237 | 238 | 239 | ### OAuth2 240 | 241 | To Setup Your App with ProZ OAuth2: 242 | 243 | 1. Create an account on [ProZ.com](https://www.proz.com). 244 | 245 | 2. Register an [API client app](https://www.proz.com/oauth/client-apps). 246 | 247 | You will be assigned a `client_id` and `client_secret`. You will need to choose a `redirect_uri`. For example, you could choose something like: `redirect_uri: https://www.yourdomain.com/proz` or `redirect_uri: https://www.yourdomain.com`. 248 | 249 | 3. Create a route in your project for the above `redirect_uri` if that route does not already exist. 250 | If you are building a Rails app, an example might be: 251 | 252 | *config/routes.rb* 253 | 254 | ```ruby 255 | match '/proz', to: 'static_pages#proz', via: :get 256 | ``` 257 | 258 | 4. Create a link within your app 259 | 260 | *controller* 261 | ```ruby 262 | proz_oauth = Proz::OAuth.new(client_id: 'yourClientID', client_secret: 'yourClientSecret', redirect_uri: 'yourRedirectURI') 263 | @oauth_link = proz_oauth.link 264 | ``` 265 | 266 | *view* 267 | ```ruby 268 | <%= link_to "Link your ProZ.com Account", @oauth_link %> 269 | ``` 270 | 271 | 5. Exchange your authorization code for an access token 272 | ```ruby 273 | token = proz_oauth.exchange_code_for_token(params[:code]) 274 | ``` 275 | 276 | 6. Save the token and refresh token (*optional*) 277 | ```ruby 278 | current_user.update_columns(proz_oauth_token: token['access_token'], proz_refresh_token: token['refresh_token']) 279 | ``` 280 | 281 | 7. Retrieve the user's profile info 282 | ```ruby 283 | proz = Proz::Profile.new(token: token['access_token']) 284 | proz.uuid 285 | # => '7bbfdd74-a2a4-484f-8dbc-215a67026ce1' 286 | 287 | proz.site_name 288 | # => 'Kevin Dias' 289 | 290 | proz.profile_url 291 | # => 'http://www.proz.com/profile/1979687' 292 | ``` 293 | 294 | **Supported Methods** 295 | * `uuid` 296 | * `site_name` 297 | * `profile_url` 298 | * `contact_info` 299 | * `skills` 300 | 301 | Further details for each method can be found in the [ProZ API Specification](http://www.proz.com/api-docs/types/freelancer). 302 | 303 | ## TODO 304 | 305 | 1. Add the [Messaging Service API](http://www.proz.com/api-docs/messaging) 306 | 307 | ## Contributing 308 | 309 | 1. Fork it ( https://github.com/diasks2/proz/fork ) 310 | 2. Create your feature branch (`git checkout -b my-new-feature`) 311 | 3. Commit your changes (`git commit -am 'Add some feature'`) 312 | 4. Push to the branch (`git push origin my-new-feature`) 313 | 5. Create a new Pull Request 314 | 315 | ## License 316 | 317 | The MIT License (MIT) 318 | 319 | Copyright (c) 2015 Kevin S. Dias 320 | 321 | Permission is hereby granted, free of charge, to any person obtaining a copy 322 | of this software and associated documentation files (the "Software"), to deal 323 | in the Software without restriction, including without limitation the rights 324 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 325 | copies of the Software, and to permit persons to whom the Software is 326 | furnished to do so, subject to the following conditions: 327 | 328 | The above copyright notice and this permission notice shall be included in 329 | all copies or substantial portions of the Software. 330 | 331 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 332 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 333 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 334 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 335 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 336 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 337 | THE SOFTWARE. -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/match_query.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.proz.com/v2/freelancer-matches?language_pair=eng_esl 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | X-Proz-Api-Key: 11 | - xxxxxxxxx 12 | response: 13 | status: 14 | code: 200 15 | message: OK 16 | headers: 17 | Date: 18 | - Wed, 04 Feb 2015 03:06:13 GMT 19 | Server: 20 | - Apache 21 | Cache-Control: 22 | - no-cache 23 | Transfer-Encoding: 24 | - chunked 25 | Content-Type: 26 | - application/json 27 | body: 28 | encoding: UTF-8 29 | string: '{"success":1,"meta":{"num_results":58419},"data":[{"freelancer":{"uuid":"663e4488-58a1-4713-992c-c6d90aafa3cb","site_name":"Smartranslators","profile_url":"http:\/\/www.proz.com\/profile\/76374","contact_info":{},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 30 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 31 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"},{"service_id":8,"service_name":"Interpreting, 32 | Chuchotage\/Whispering"}]},{"pair_code":"esl_eng","pair_name":"Spanish to 33 | English","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]},{"pair_code":"fra_esl","pair_name":"French 34 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]}],"general_disciplines":[{"disc_gen_id":1,"disc_gen_name":"Tech\/Engineering"},{"disc_gen_id":4,"disc_gen_name":"Law\/Patents"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":7,"disc_gen_name":"Marketing"},{"disc_gen_id":8,"disc_gen_name":"Other"}],"specific_disciplines":[{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 35 | (general)","expertise_level":"specialty"},{"disc_spec_id":77,"disc_spec_name":"Law 36 | (general)","expertise_level":"specialty"},{"disc_spec_id":48,"disc_spec_name":"Finance 37 | (general)","expertise_level":"specialty"},{"disc_spec_id":25,"disc_spec_name":"Computers: 38 | Systems, Networks","expertise_level":"specialty"},{"disc_spec_id":23,"disc_spec_name":"Computers: 39 | Hardware","expertise_level":"specialty"},{"disc_spec_id":24,"disc_spec_name":"Computers: 40 | Software","expertise_level":"specialty"},{"disc_spec_id":26,"disc_spec_name":"Construction 41 | \/ Civil Engineering","expertise_level":"specialty"},{"disc_spec_id":147,"disc_spec_name":"Computers 42 | (general)","expertise_level":"specialty"},{"disc_spec_id":159,"disc_spec_name":"Automation 43 | \u0026 Robotics","expertise_level":"specialty"},{"disc_spec_id":32,"disc_spec_name":"Economics","expertise_level":"specialty"},{"disc_spec_id":68,"disc_spec_name":"IT 44 | (Information Technology)","expertise_level":"working"},{"disc_spec_id":75,"disc_spec_name":"Law: 45 | Contract(s)","expertise_level":"working"},{"disc_spec_id":1,"disc_spec_name":"Accounting","expertise_level":"working"},{"disc_spec_id":6,"disc_spec_name":"Architecture","expertise_level":"working"},{"disc_spec_id":34,"disc_spec_name":"Electronics 46 | \/ Elect Eng","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"24593"}},{"freelancer":{"uuid":"d911bda5-fd9f-4bc1-845a-b5012a8812f2","site_name":"Rafael 47 | Molina Pulgar","profile_url":"http:\/\/www.proz.com\/profile\/9997","contact_info":{"first_name":"Rafael","middle_name":"","last_name":"Molina 48 | Pulgar"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 49 | to Spanish","services":[{"service_id":1,"service_name":"Translation"}]},{"pair_code":"fra_esl","pair_name":"French 50 | to Spanish","services":[{"service_id":1,"service_name":"Translation"}]},{"pair_code":"por_esl","pair_name":"Portuguese 51 | to Spanish","services":[{"service_id":1,"service_name":"Translation"}]},{"pair_code":"esl_esl","pair_name":"Spanish","services":[{"service_id":1,"service_name":"Translation"}]}],"general_disciplines":[{"disc_gen_id":2,"disc_gen_name":"Art\/Literary"},{"disc_gen_id":3,"disc_gen_name":"Medical"},{"disc_gen_id":4,"disc_gen_name":"Law\/Patents"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":8,"disc_gen_name":"Other"},{"disc_gen_id":9,"disc_gen_name":"Social 52 | Sciences"}],"specific_disciplines":[{"disc_spec_id":48,"disc_spec_name":"Finance 53 | (general)","expertise_level":"specialty"},{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 54 | (general)","expertise_level":"specialty"},{"disc_spec_id":72,"disc_spec_name":"Investment 55 | \/ Securities","expertise_level":"specialty"},{"disc_spec_id":85,"disc_spec_name":"Management","expertise_level":"specialty"},{"disc_spec_id":75,"disc_spec_name":"Law: 56 | Contract(s)","expertise_level":"specialty"},{"disc_spec_id":67,"disc_spec_name":"Human 57 | Resources","expertise_level":"specialty"},{"disc_spec_id":1,"disc_spec_name":"Accounting","expertise_level":"specialty"},{"disc_spec_id":32,"disc_spec_name":"Economics","expertise_level":"specialty"},{"disc_spec_id":33,"disc_spec_name":"Education 58 | \/ Pedagogy","expertise_level":"specialty"},{"disc_spec_id":62,"disc_spec_name":"Government 59 | \/ Politics","expertise_level":"specialty"},{"disc_spec_id":57,"disc_spec_name":"General 60 | \/ Conversation \/ Greetings \/ Letters","expertise_level":"working"},{"disc_spec_id":69,"disc_spec_name":"Insurance","expertise_level":"working"},{"disc_spec_id":139,"disc_spec_name":"Tourism 61 | \u0026 Travel","expertise_level":"working"},{"disc_spec_id":70,"disc_spec_name":"International 62 | Org\/Dev\/Coop","expertise_level":"working"},{"disc_spec_id":130,"disc_spec_name":"Social 63 | Science, Sociology, Ethics, etc.","expertise_level":"working"},{"disc_spec_id":77,"disc_spec_name":"Law 64 | (general)","expertise_level":"working"},{"disc_spec_id":95,"disc_spec_name":"Medical 65 | (general)","expertise_level":"working"},{"disc_spec_id":94,"disc_spec_name":"Medical: 66 | Health Care","expertise_level":"working"},{"disc_spec_id":124,"disc_spec_name":"Retail","expertise_level":"working"},{"disc_spec_id":65,"disc_spec_name":"History","expertise_level":"working"},{"disc_spec_id":138,"disc_spec_name":"Textiles 67 | \/ Clothing \/ Fashion","expertise_level":"working"},{"disc_spec_id":150,"disc_spec_name":"Names 68 | (personal, company)","expertise_level":"working"},{"disc_spec_id":91,"disc_spec_name":"Media 69 | \/ Multimedia","expertise_level":"working"},{"disc_spec_id":60,"disc_spec_name":"Geography","expertise_level":"working"},{"disc_spec_id":123,"disc_spec_name":"Religion","expertise_level":"working"},{"disc_spec_id":80,"disc_spec_name":"Linguistics","expertise_level":"working"},{"disc_spec_id":152,"disc_spec_name":"Idioms 70 | \/ Maxims \/ Sayings","expertise_level":"working"},{"disc_spec_id":7,"disc_spec_name":"Art, 71 | Arts \u0026 Crafts, Painting","expertise_level":"working"},{"disc_spec_id":2,"disc_spec_name":"Advertising 72 | \/ Public Relations","expertise_level":"working"},{"disc_spec_id":29,"disc_spec_name":"Cosmetics, 73 | Beauty","expertise_level":"working"},{"disc_spec_id":104,"disc_spec_name":"Nutrition","expertise_level":"working"},{"disc_spec_id":51,"disc_spec_name":"Food 74 | \u0026 Drink","expertise_level":"working"},{"disc_spec_id":44,"disc_spec_name":"Environment 75 | \u0026 Ecology","expertise_level":"working"},{"disc_spec_id":50,"disc_spec_name":"Folklore","expertise_level":"working"},{"disc_spec_id":53,"disc_spec_name":"Furniture 76 | \/ Household Appliances","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"9973"}},{"freelancer":{"uuid":"0f6b133f-05ad-43cd-9907-0e3e2935b483","site_name":"Beatriz 77 | Ram\u00edrez de Haro","profile_url":"http:\/\/www.proz.com\/profile\/669496","contact_info":{"first_name":"Beatriz","middle_name":"","last_name":"Ram\u00edrez 78 | de Haro"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 79 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 80 | Consecutive"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"},{"service_id":8,"service_name":"Interpreting, 81 | Chuchotage\/Whispering"},{"service_id":9,"service_name":"Interpreting, Liaison"},{"service_id":10,"service_name":"Interpreting, 82 | Phone"},{"service_id":11,"service_name":"Transcription"}]},{"pair_code":"fra_esl","pair_name":"French 83 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 84 | Consecutive"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"},{"service_id":8,"service_name":"Interpreting, 85 | Chuchotage\/Whispering"},{"service_id":9,"service_name":"Interpreting, Liaison"},{"service_id":10,"service_name":"Interpreting, 86 | Phone"},{"service_id":11,"service_name":"Transcription"}]},{"pair_code":"esl_esl","pair_name":"Spanish","services":[{"service_id":2,"service_name":"Checking\/editing"}]}],"general_disciplines":[{"disc_gen_id":2,"disc_gen_name":"Art\/Literary"},{"disc_gen_id":7,"disc_gen_name":"Marketing"},{"disc_gen_id":8,"disc_gen_name":"Other"},{"disc_gen_id":9,"disc_gen_name":"Social 87 | Sciences"}],"specific_disciplines":[{"disc_spec_id":133,"disc_spec_name":"Sports 88 | \/ Fitness \/ Recreation","expertise_level":"specialty"},{"disc_spec_id":82,"disc_spec_name":"Poetry 89 | \u0026 Literature","expertise_level":"specialty"},{"disc_spec_id":87,"disc_spec_name":"Marketing 90 | \/ Market Research","expertise_level":"specialty"},{"disc_spec_id":123,"disc_spec_name":"Religion","expertise_level":"specialty"},{"disc_spec_id":65,"disc_spec_name":"History","expertise_level":"specialty"},{"disc_spec_id":130,"disc_spec_name":"Social 91 | Science, Sociology, Ethics, etc.","expertise_level":"specialty"},{"disc_spec_id":57,"disc_spec_name":"General 92 | \/ Conversation \/ Greetings \/ Letters","expertise_level":"specialty"},{"disc_spec_id":152,"disc_spec_name":"Idioms 93 | \/ Maxims \/ Sayings","expertise_level":"specialty"},{"disc_spec_id":105,"disc_spec_name":"Other","expertise_level":"working"},{"disc_spec_id":154,"disc_spec_name":"Journalism","expertise_level":"working"},{"disc_spec_id":139,"disc_spec_name":"Tourism 94 | \u0026 Travel","expertise_level":"working"},{"disc_spec_id":80,"disc_spec_name":"Linguistics","expertise_level":"working"},{"disc_spec_id":120,"disc_spec_name":"Psychology","expertise_level":"working"},{"disc_spec_id":112,"disc_spec_name":"Philosophy","expertise_level":"working"},{"disc_spec_id":62,"disc_spec_name":"Government 95 | \/ Politics","expertise_level":"working"},{"disc_spec_id":7,"disc_spec_name":"Art, 96 | Arts \u0026 Crafts, Painting","expertise_level":"working"},{"disc_spec_id":20,"disc_spec_name":"Cinema, 97 | Film, TV, Drama","expertise_level":"working"},{"disc_spec_id":2,"disc_spec_name":"Advertising 98 | \/ Public Relations","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"7310"}},{"freelancer":{"uuid":"5b7bedc5-2d1c-4fca-af32-6b4dd719de06","site_name":"M\u00f3nica 99 | Algazi","profile_url":"http:\/\/www.proz.com\/profile\/62856","contact_info":{"first_name":"M\u00f3nica","middle_name":"","last_name":"Algazi"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 100 | to Spanish","services":[{"service_id":1,"service_name":"Translation"}]}],"general_disciplines":[{"disc_gen_id":2,"disc_gen_name":"Art\/Literary"},{"disc_gen_id":3,"disc_gen_name":"Medical"},{"disc_gen_id":4,"disc_gen_name":"Law\/Patents"},{"disc_gen_id":7,"disc_gen_name":"Marketing"},{"disc_gen_id":8,"disc_gen_name":"Other"}],"specific_disciplines":[{"disc_spec_id":77,"disc_spec_name":"Law 101 | (general)","expertise_level":"specialty"},{"disc_spec_id":75,"disc_spec_name":"Law: 102 | Contract(s)","expertise_level":"specialty"},{"disc_spec_id":154,"disc_spec_name":"Journalism","expertise_level":"specialty"},{"disc_spec_id":139,"disc_spec_name":"Tourism 103 | \u0026 Travel","expertise_level":"specialty"},{"disc_spec_id":3,"disc_spec_name":"Agriculture","expertise_level":"specialty"},{"disc_spec_id":44,"disc_spec_name":"Environment 104 | \u0026 Ecology","expertise_level":"specialty"},{"disc_spec_id":133,"disc_spec_name":"Sports 105 | \/ Fitness \/ Recreation","expertise_level":"specialty"},{"disc_spec_id":33,"disc_spec_name":"Education 106 | \/ Pedagogy","expertise_level":"specialty"},{"disc_spec_id":87,"disc_spec_name":"Marketing 107 | \/ Market Research","expertise_level":"specialty"},{"disc_spec_id":2,"disc_spec_name":"Advertising 108 | \/ Public Relations","expertise_level":"specialty"},{"disc_spec_id":5,"disc_spec_name":"Anthropology","expertise_level":"working"},{"disc_spec_id":158,"disc_spec_name":"Certificates, 109 | Diplomas, Licenses, CVs","expertise_level":"working"},{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 110 | (general)","expertise_level":"working"},{"disc_spec_id":51,"disc_spec_name":"Food 111 | \u0026 Drink","expertise_level":"working"},{"disc_spec_id":29,"disc_spec_name":"Cosmetics, 112 | Beauty","expertise_level":"working"},{"disc_spec_id":32,"disc_spec_name":"Economics","expertise_level":"working"},{"disc_spec_id":53,"disc_spec_name":"Furniture 113 | \/ Household Appliances","expertise_level":"working"},{"disc_spec_id":57,"disc_spec_name":"General 114 | \/ Conversation \/ Greetings \/ Letters","expertise_level":"working"},{"disc_spec_id":60,"disc_spec_name":"Geography","expertise_level":"working"},{"disc_spec_id":62,"disc_spec_name":"Government 115 | \/ Politics","expertise_level":"working"},{"disc_spec_id":65,"disc_spec_name":"History","expertise_level":"working"},{"disc_spec_id":67,"disc_spec_name":"Human 116 | Resources","expertise_level":"working"},{"disc_spec_id":152,"disc_spec_name":"Idioms 117 | \/ Maxims \/ Sayings","expertise_level":"working"},{"disc_spec_id":70,"disc_spec_name":"International 118 | Org\/Dev\/Coop","expertise_level":"working"},{"disc_spec_id":76,"disc_spec_name":"Law: 119 | Patents, Trademarks, Copyright","expertise_level":"working"},{"disc_spec_id":136,"disc_spec_name":"Law: 120 | Taxation \u0026 Customs","expertise_level":"working"},{"disc_spec_id":80,"disc_spec_name":"Linguistics","expertise_level":"working"},{"disc_spec_id":81,"disc_spec_name":"Livestock 121 | \/ Animal Husbandry","expertise_level":"working"},{"disc_spec_id":85,"disc_spec_name":"Management","expertise_level":"working"},{"disc_spec_id":88,"disc_spec_name":"Materials 122 | (Plastics, Ceramics, etc.)","expertise_level":"working"},{"disc_spec_id":16,"disc_spec_name":"Medical: 123 | Cardiology","expertise_level":"working"},{"disc_spec_id":93,"disc_spec_name":"Medical: 124 | Instruments","expertise_level":"working"},{"disc_spec_id":104,"disc_spec_name":"Nutrition","expertise_level":"working"},{"disc_spec_id":105,"disc_spec_name":"Other","expertise_level":"working"},{"disc_spec_id":107,"disc_spec_name":"Paper 125 | \/ Paper Manufacturing","expertise_level":"working"},{"disc_spec_id":122,"disc_spec_name":"Real 126 | Estate","expertise_level":"working"},{"disc_spec_id":124,"disc_spec_name":"Retail","expertise_level":"working"},{"disc_spec_id":130,"disc_spec_name":"Social 127 | Science, Sociology, Ethics, etc.","expertise_level":"working"},{"disc_spec_id":137,"disc_spec_name":"Telecom(munications)","expertise_level":"working"},{"disc_spec_id":140,"disc_spec_name":"Transport 128 | \/ Transportation \/ Shipping","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"7063"}},{"freelancer":{"uuid":"50853981-cda6-41f4-860e-e7383bf5766b","site_name":"Marina 129 | Soldati","profile_url":"http:\/\/www.proz.com\/profile\/108251","contact_info":{"first_name":"Marina","middle_name":"","last_name":"Soldati"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 130 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]},{"pair_code":"esl_esl","pair_name":"Spanish","services":[{"service_id":2,"service_name":"Checking\/editing"}]}],"general_disciplines":[{"disc_gen_id":1,"disc_gen_name":"Tech\/Engineering"},{"disc_gen_id":4,"disc_gen_name":"Law\/Patents"},{"disc_gen_id":5,"disc_gen_name":"Science"},{"disc_gen_id":7,"disc_gen_name":"Marketing"},{"disc_gen_id":9,"disc_gen_name":"Social 131 | Sciences"}],"specific_disciplines":[{"disc_spec_id":110,"disc_spec_name":"Petroleum 132 | Eng\/Sci","expertise_level":"specialty"},{"disc_spec_id":40,"disc_spec_name":"Engineering 133 | (general)","expertise_level":"specialty"},{"disc_spec_id":147,"disc_spec_name":"Computers 134 | (general)","expertise_level":"specialty"},{"disc_spec_id":9,"disc_spec_name":"Automotive 135 | \/ Cars \u0026 Trucks","expertise_level":"specialty"},{"disc_spec_id":23,"disc_spec_name":"Computers: 136 | Hardware","expertise_level":"specialty"},{"disc_spec_id":24,"disc_spec_name":"Computers: 137 | Software","expertise_level":"specialty"},{"disc_spec_id":71,"disc_spec_name":"Internet, 138 | e-Commerce","expertise_level":"specialty"},{"disc_spec_id":25,"disc_spec_name":"Computers: 139 | Systems, Networks","expertise_level":"specialty"},{"disc_spec_id":68,"disc_spec_name":"IT 140 | (Information Technology)","expertise_level":"specialty"},{"disc_spec_id":65,"disc_spec_name":"History","expertise_level":"specialty"},{"disc_spec_id":93,"disc_spec_name":"Medical: 141 | Instruments","expertise_level":"working"},{"disc_spec_id":34,"disc_spec_name":"Electronics 142 | \/ Elect Eng","expertise_level":"working"},{"disc_spec_id":128,"disc_spec_name":"Science 143 | (general)","expertise_level":"working"},{"disc_spec_id":137,"disc_spec_name":"Telecom(munications)","expertise_level":"working"},{"disc_spec_id":94,"disc_spec_name":"Medical: 144 | Health Care","expertise_level":"working"},{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 145 | (general)","expertise_level":"working"},{"disc_spec_id":139,"disc_spec_name":"Tourism 146 | \u0026 Travel","expertise_level":"working"},{"disc_spec_id":67,"disc_spec_name":"Human 147 | Resources","expertise_level":"working"},{"disc_spec_id":62,"disc_spec_name":"Government 148 | \/ Politics","expertise_level":"working"},{"disc_spec_id":130,"disc_spec_name":"Social 149 | Science, Sociology, Ethics, etc.","expertise_level":"working"},{"disc_spec_id":81,"disc_spec_name":"Livestock 150 | \/ Animal Husbandry","expertise_level":"working"},{"disc_spec_id":87,"disc_spec_name":"Marketing 151 | \/ Market Research","expertise_level":"working"},{"disc_spec_id":104,"disc_spec_name":"Nutrition","expertise_level":"working"},{"disc_spec_id":2,"disc_spec_name":"Advertising 152 | \/ Public Relations","expertise_level":"working"},{"disc_spec_id":44,"disc_spec_name":"Environment 153 | \u0026 Ecology","expertise_level":"working"},{"disc_spec_id":60,"disc_spec_name":"Geography","expertise_level":"working"},{"disc_spec_id":77,"disc_spec_name":"Law 154 | (general)","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"6244"}},{"freelancer":{"uuid":"f495c663-c70d-450f-846c-2947eda5e910","site_name":"Cristina 155 | Heraud-van Tol","profile_url":"http:\/\/www.proz.com\/profile\/63165","contact_info":{"first_name":"Cristina","middle_name":"","last_name":"Heraud-van 156 | Tol"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 157 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":4,"service_name":"Interpreting, 158 | Simultaneous"}]},{"pair_code":"fra_esl","pair_name":"French to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":3,"service_name":"Interpreting, 159 | Consecutive"}]},{"pair_code":"esl_eng","pair_name":"Spanish to English","services":[{"service_id":1,"service_name":"Translation"},{"service_id":4,"service_name":"Interpreting, 160 | Simultaneous"}]},{"pair_code":"esl_fra","pair_name":"Spanish to French","services":[{"service_id":3,"service_name":"Interpreting, 161 | Consecutive"}]},{"pair_code":"fra_eng","pair_name":"French to English","services":[{"service_id":3,"service_name":"Interpreting, 162 | Consecutive"}]},{"pair_code":"eng_fra","pair_name":"English to French","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]},{"pair_code":"eng_dut","pair_name":"English 163 | to Dutch","services":[{"service_id":1,"service_name":"Translation"}]},{"pair_code":"esl_dut","pair_name":"Spanish 164 | to Dutch","services":[{"service_id":1,"service_name":"Translation"}]}],"general_disciplines":[{"disc_gen_id":1,"disc_gen_name":"Tech\/Engineering"},{"disc_gen_id":2,"disc_gen_name":"Art\/Literary"},{"disc_gen_id":3,"disc_gen_name":"Medical"},{"disc_gen_id":4,"disc_gen_name":"Law\/Patents"},{"disc_gen_id":5,"disc_gen_name":"Science"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":7,"disc_gen_name":"Marketing"},{"disc_gen_id":8,"disc_gen_name":"Other"},{"disc_gen_id":9,"disc_gen_name":"Social 165 | Sciences"}],"specific_disciplines":[{"disc_spec_id":29,"disc_spec_name":"Cosmetics, 166 | Beauty","expertise_level":"specialty"},{"disc_spec_id":35,"disc_spec_name":"Energy 167 | \/ Power Generation","expertise_level":"specialty"},{"disc_spec_id":92,"disc_spec_name":"Medical: 168 | Pharmaceuticals","expertise_level":"specialty"},{"disc_spec_id":44,"disc_spec_name":"Environment 169 | \u0026 Ecology","expertise_level":"specialty"},{"disc_spec_id":137,"disc_spec_name":"Telecom(munications)","expertise_level":"specialty"},{"disc_spec_id":128,"disc_spec_name":"Science 170 | (general)","expertise_level":"working"},{"disc_spec_id":12,"disc_spec_name":"Biology 171 | (-tech,-chem,micro-)","expertise_level":"specialty"},{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 172 | (general)","expertise_level":"specialty"},{"disc_spec_id":139,"disc_spec_name":"Tourism 173 | \u0026 Travel","expertise_level":"specialty"},{"disc_spec_id":87,"disc_spec_name":"Marketing 174 | \/ Market Research","expertise_level":"specialty"},{"disc_spec_id":75,"disc_spec_name":"Law: 175 | Contract(s)","expertise_level":"working"},{"disc_spec_id":77,"disc_spec_name":"Law 176 | (general)","expertise_level":"working"},{"disc_spec_id":90,"disc_spec_name":"Mechanics 177 | \/ Mech Engineering","expertise_level":"working"},{"disc_spec_id":147,"disc_spec_name":"Computers 178 | (general)","expertise_level":"working"},{"disc_spec_id":130,"disc_spec_name":"Social 179 | Science, Sociology, Ethics, etc.","expertise_level":"working"},{"disc_spec_id":123,"disc_spec_name":"Religion","expertise_level":"working"},{"disc_spec_id":107,"disc_spec_name":"Paper 180 | \/ Paper Manufacturing","expertise_level":"working"},{"disc_spec_id":105,"disc_spec_name":"Other","expertise_level":"working"},{"disc_spec_id":99,"disc_spec_name":"Mining 181 | \u0026 Minerals \/ Gems","expertise_level":"working"},{"disc_spec_id":95,"disc_spec_name":"Medical 182 | (general)","expertise_level":"working"},{"disc_spec_id":93,"disc_spec_name":"Medical: 183 | Instruments","expertise_level":"working"},{"disc_spec_id":69,"disc_spec_name":"Insurance","expertise_level":"working"},{"disc_spec_id":65,"disc_spec_name":"History","expertise_level":"working"},{"disc_spec_id":28,"disc_spec_name":"Cooking 184 | \/ Culinary","expertise_level":"working"},{"disc_spec_id":24,"disc_spec_name":"Computers: 185 | Software","expertise_level":"working"},{"disc_spec_id":23,"disc_spec_name":"Computers: 186 | Hardware","expertise_level":"working"},{"disc_spec_id":9,"disc_spec_name":"Automotive 187 | \/ Cars \u0026 Trucks","expertise_level":"working"},{"disc_spec_id":6,"disc_spec_name":"Architecture","expertise_level":"working"},{"disc_spec_id":5,"disc_spec_name":"Anthropology","expertise_level":"working"},{"disc_spec_id":32,"disc_spec_name":"Economics","expertise_level":"working"},{"disc_spec_id":34,"disc_spec_name":"Electronics 188 | \/ Elect Eng","expertise_level":"working"},{"disc_spec_id":54,"disc_spec_name":"Games 189 | \/ Video Games \/ Gaming \/ Casino","expertise_level":"working"},{"disc_spec_id":51,"disc_spec_name":"Food 190 | \u0026 Drink","expertise_level":"working"},{"disc_spec_id":48,"disc_spec_name":"Finance 191 | (general)","expertise_level":"working"},{"disc_spec_id":151,"disc_spec_name":"Archaeology","expertise_level":"working"},{"disc_spec_id":41,"disc_spec_name":"Engineering: 192 | Industrial","expertise_level":"working"},{"disc_spec_id":40,"disc_spec_name":"Engineering 193 | (general)","expertise_level":"working"},{"disc_spec_id":158,"disc_spec_name":"Certificates, 194 | Diplomas, Licenses, CVs","expertise_level":"working"},{"disc_spec_id":8,"disc_spec_name":"Astronomy 195 | \u0026 Space","expertise_level":"working"},{"disc_spec_id":110,"disc_spec_name":"Petroleum 196 | Eng\/Sci","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"4968"}},{"freelancer":{"uuid":"8b6e34c5-c5bb-4eca-a0e4-ea445a4bd5ce","site_name":"Jorge 197 | Merino","profile_url":"http:\/\/www.proz.com\/profile\/578770","contact_info":{"first_name":"Jorge","middle_name":"","last_name":"Merino"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 198 | to Spanish","services":[{"service_id":1,"service_name":"Translation"}]},{"pair_code":"esl_eng","pair_name":"Spanish 199 | to English","services":[{"service_id":1,"service_name":"Translation"}]}],"general_disciplines":[{"disc_gen_id":1,"disc_gen_name":"Tech\/Engineering"},{"disc_gen_id":5,"disc_gen_name":"Science"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":7,"disc_gen_name":"Marketing"}],"specific_disciplines":[{"disc_spec_id":140,"disc_spec_name":"Transport 200 | \/ Transportation \/ Shipping","expertise_level":"specialty"},{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 201 | (general)","expertise_level":"specialty"},{"disc_spec_id":87,"disc_spec_name":"Marketing 202 | \/ Market Research","expertise_level":"specialty"},{"disc_spec_id":71,"disc_spec_name":"Internet, 203 | e-Commerce","expertise_level":"specialty"},{"disc_spec_id":48,"disc_spec_name":"Finance 204 | (general)","expertise_level":"specialty"},{"disc_spec_id":23,"disc_spec_name":"Computers: 205 | Hardware","expertise_level":"working"},{"disc_spec_id":9,"disc_spec_name":"Automotive 206 | \/ Cars \u0026 Trucks","expertise_level":"working"},{"disc_spec_id":159,"disc_spec_name":"Automation 207 | \u0026 Robotics","expertise_level":"working"},{"disc_spec_id":24,"disc_spec_name":"Computers: 208 | Software","expertise_level":"working"},{"disc_spec_id":25,"disc_spec_name":"Computers: 209 | Systems, Networks","expertise_level":"working"},{"disc_spec_id":34,"disc_spec_name":"Electronics 210 | \/ Elect Eng","expertise_level":"working"},{"disc_spec_id":137,"disc_spec_name":"Telecom(munications)","expertise_level":"working"},{"disc_spec_id":90,"disc_spec_name":"Mechanics 211 | \/ Mech Engineering","expertise_level":"working"},{"disc_spec_id":89,"disc_spec_name":"Mathematics 212 | \u0026 Statistics","expertise_level":"working"},{"disc_spec_id":147,"disc_spec_name":"Computers 213 | (general)","expertise_level":"working"},{"disc_spec_id":68,"disc_spec_name":"IT 214 | (Information Technology)","expertise_level":"working"},{"disc_spec_id":41,"disc_spec_name":"Engineering: 215 | Industrial","expertise_level":"working"},{"disc_spec_id":40,"disc_spec_name":"Engineering 216 | (general)","expertise_level":"working"},{"disc_spec_id":35,"disc_spec_name":"Energy 217 | \/ Power Generation","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"4934"}},{"freelancer":{"uuid":"382d574c-65a0-4102-b4fe-cd8735449fd3","site_name":"Mercedes 218 | Marta Moreno","profile_url":"http:\/\/www.proz.com\/profile\/1178885","contact_info":{"first_name":"Mercedes 219 | Marta ","middle_name":null,"last_name":"Moreno"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 220 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":6,"service_name":"Summarization"},{"service_id":11,"service_name":"Transcription"}]},{"pair_code":"fra_esl","pair_name":"French 221 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":11,"service_name":"Transcription"}]}],"general_disciplines":[{"disc_gen_id":4,"disc_gen_name":"Law\/Patents"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":7,"disc_gen_name":"Marketing"},{"disc_gen_id":8,"disc_gen_name":"Other"},{"disc_gen_id":9,"disc_gen_name":"Social 222 | Sciences"}],"specific_disciplines":[{"disc_spec_id":77,"disc_spec_name":"Law 223 | (general)","expertise_level":"specialty"},{"disc_spec_id":75,"disc_spec_name":"Law: 224 | Contract(s)","expertise_level":"specialty"},{"disc_spec_id":76,"disc_spec_name":"Law: 225 | Patents, Trademarks, Copyright","expertise_level":"specialty"},{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 226 | (general)","expertise_level":"specialty"},{"disc_spec_id":48,"disc_spec_name":"Finance 227 | (general)","expertise_level":"specialty"},{"disc_spec_id":32,"disc_spec_name":"Economics","expertise_level":"specialty"},{"disc_spec_id":87,"disc_spec_name":"Marketing 228 | \/ Market Research","expertise_level":"specialty"},{"disc_spec_id":69,"disc_spec_name":"Insurance","expertise_level":"specialty"},{"disc_spec_id":130,"disc_spec_name":"Social 229 | Science, Sociology, Ethics, etc.","expertise_level":"specialty"},{"disc_spec_id":120,"disc_spec_name":"Psychology","expertise_level":"specialty"},{"disc_spec_id":136,"disc_spec_name":"Law: 230 | Taxation \u0026 Customs","expertise_level":"working"},{"disc_spec_id":170,"disc_spec_name":"Patents","expertise_level":"working"},{"disc_spec_id":1,"disc_spec_name":"Accounting","expertise_level":"working"},{"disc_spec_id":135,"disc_spec_name":"Surveying","expertise_level":"working"},{"disc_spec_id":85,"disc_spec_name":"Management","expertise_level":"working"},{"disc_spec_id":72,"disc_spec_name":"Investment 231 | \/ Securities","expertise_level":"working"},{"disc_spec_id":67,"disc_spec_name":"Human 232 | Resources","expertise_level":"working"},{"disc_spec_id":122,"disc_spec_name":"Real 233 | Estate","expertise_level":"working"},{"disc_spec_id":158,"disc_spec_name":"Certificates, 234 | Diplomas, Licenses, CVs","expertise_level":"working"},{"disc_spec_id":62,"disc_spec_name":"Government 235 | \/ Politics","expertise_level":"working"},{"disc_spec_id":70,"disc_spec_name":"International 236 | Org\/Dev\/Coop","expertise_level":"working"},{"disc_spec_id":112,"disc_spec_name":"Philosophy","expertise_level":"working"},{"disc_spec_id":65,"disc_spec_name":"History","expertise_level":"working"},{"disc_spec_id":128,"disc_spec_name":"Science 237 | (general)","expertise_level":"working"},{"disc_spec_id":44,"disc_spec_name":"Environment 238 | \u0026 Ecology","expertise_level":"working"},{"disc_spec_id":152,"disc_spec_name":"Idioms 239 | \/ Maxims \/ Sayings","expertise_level":"working"},{"disc_spec_id":154,"disc_spec_name":"Journalism","expertise_level":"working"},{"disc_spec_id":80,"disc_spec_name":"Linguistics","expertise_level":"working"},{"disc_spec_id":57,"disc_spec_name":"General 240 | \/ Conversation \/ Greetings \/ Letters","expertise_level":"working"},{"disc_spec_id":82,"disc_spec_name":"Poetry 241 | \u0026 Literature","expertise_level":"working"},{"disc_spec_id":91,"disc_spec_name":"Media 242 | \/ Multimedia","expertise_level":"working"},{"disc_spec_id":2,"disc_spec_name":"Advertising 243 | \/ Public Relations","expertise_level":"working"},{"disc_spec_id":20,"disc_spec_name":"Cinema, 244 | Film, TV, Drama","expertise_level":"working"},{"disc_spec_id":33,"disc_spec_name":"Education 245 | \/ Pedagogy","expertise_level":"working"},{"disc_spec_id":71,"disc_spec_name":"Internet, 246 | e-Commerce","expertise_level":"working"},{"disc_spec_id":138,"disc_spec_name":"Textiles 247 | \/ Clothing \/ Fashion","expertise_level":"working"},{"disc_spec_id":29,"disc_spec_name":"Cosmetics, 248 | Beauty","expertise_level":"working"},{"disc_spec_id":139,"disc_spec_name":"Tourism 249 | \u0026 Travel","expertise_level":"working"},{"disc_spec_id":140,"disc_spec_name":"Transport 250 | \/ Transportation \/ Shipping","expertise_level":"working"},{"disc_spec_id":105,"disc_spec_name":"Other","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"4706"}},{"freelancer":{"uuid":"547861b5-a890-400e-a1f8-c2ebec08d429","site_name":"Tom\u00e1s 251 | Cano Binder, CT","profile_url":"http:\/\/www.proz.com\/profile\/26649","contact_info":{"first_name":"Tom\u00e1s","middle_name":"","last_name":"Cano 252 | Binder, CT"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 253 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]},{"pair_code":"deu_esl","pair_name":"German 254 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]},{"pair_code":"por_esl","pair_name":"Portuguese 255 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]}],"general_disciplines":[{"disc_gen_id":1,"disc_gen_name":"Tech\/Engineering"},{"disc_gen_id":3,"disc_gen_name":"Medical"},{"disc_gen_id":5,"disc_gen_name":"Science"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":7,"disc_gen_name":"Marketing"},{"disc_gen_id":8,"disc_gen_name":"Other"},{"disc_gen_id":9,"disc_gen_name":"Social 256 | Sciences"}],"specific_disciplines":[{"disc_spec_id":157,"disc_spec_name":"Manufacturing","expertise_level":"specialty"},{"disc_spec_id":137,"disc_spec_name":"Telecom(munications)","expertise_level":"specialty"},{"disc_spec_id":9,"disc_spec_name":"Automotive 257 | \/ Cars \u0026 Trucks","expertise_level":"specialty"},{"disc_spec_id":159,"disc_spec_name":"Automation 258 | \u0026 Robotics","expertise_level":"specialty"},{"disc_spec_id":119,"disc_spec_name":"Printing 259 | \u0026 Publishing","expertise_level":"specialty"},{"disc_spec_id":41,"disc_spec_name":"Engineering: 260 | Industrial","expertise_level":"specialty"},{"disc_spec_id":107,"disc_spec_name":"Paper 261 | \/ Paper Manufacturing","expertise_level":"specialty"},{"disc_spec_id":90,"disc_spec_name":"Mechanics 262 | \/ Mech Engineering","expertise_level":"specialty"},{"disc_spec_id":34,"disc_spec_name":"Electronics 263 | \/ Elect Eng","expertise_level":"specialty"},{"disc_spec_id":68,"disc_spec_name":"IT 264 | (Information Technology)","expertise_level":"specialty"},{"disc_spec_id":75,"disc_spec_name":"Law: 265 | Contract(s)","expertise_level":"working"},{"disc_spec_id":77,"disc_spec_name":"Law 266 | (general)","expertise_level":"working"},{"disc_spec_id":48,"disc_spec_name":"Finance 267 | (general)","expertise_level":"working"},{"disc_spec_id":32,"disc_spec_name":"Economics","expertise_level":"working"},{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 268 | (general)","expertise_level":"working"},{"disc_spec_id":113,"disc_spec_name":"Photography\/Imaging 269 | (\u0026 Graphic Arts)","expertise_level":"working"},{"disc_spec_id":129,"disc_spec_name":"Ships, 270 | Sailing, Maritime","expertise_level":"working"},{"disc_spec_id":140,"disc_spec_name":"Transport 271 | \/ Transportation \/ Shipping","expertise_level":"working"},{"disc_spec_id":40,"disc_spec_name":"Engineering 272 | (general)","expertise_level":"working"},{"disc_spec_id":128,"disc_spec_name":"Science 273 | (general)","expertise_level":"working"},{"disc_spec_id":2,"disc_spec_name":"Advertising 274 | \/ Public Relations","expertise_level":"working"},{"disc_spec_id":6,"disc_spec_name":"Architecture","expertise_level":"working"},{"disc_spec_id":10,"disc_spec_name":"Aerospace 275 | \/ Aviation \/ Space","expertise_level":"working"},{"disc_spec_id":12,"disc_spec_name":"Biology 276 | (-tech,-chem,micro-)","expertise_level":"working"},{"disc_spec_id":19,"disc_spec_name":"Chemistry; 277 | Chem Sci\/Eng","expertise_level":"working"},{"disc_spec_id":23,"disc_spec_name":"Computers: 278 | Hardware","expertise_level":"working"},{"disc_spec_id":24,"disc_spec_name":"Computers: 279 | Software","expertise_level":"working"},{"disc_spec_id":26,"disc_spec_name":"Construction 280 | \/ Civil Engineering","expertise_level":"working"},{"disc_spec_id":35,"disc_spec_name":"Energy 281 | \/ Power Generation","expertise_level":"working"},{"disc_spec_id":44,"disc_spec_name":"Environment 282 | \u0026 Ecology","expertise_level":"working"},{"disc_spec_id":52,"disc_spec_name":"Forestry 283 | \/ Wood \/ Timber","expertise_level":"working"},{"disc_spec_id":99,"disc_spec_name":"Mining 284 | \u0026 Minerals \/ Gems","expertise_level":"working"},{"disc_spec_id":146,"disc_spec_name":"Zoology","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"4161"}},{"freelancer":{"uuid":"0e269111-ebee-45ce-9816-22c6fee0c629","site_name":"two2tango","profile_url":"http:\/\/www.proz.com\/profile\/6349","contact_info":{},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 285 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]},{"pair_code":"por_esl","pair_name":"Portuguese 286 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]}],"general_disciplines":[{"disc_gen_id":1,"disc_gen_name":"Tech\/Engineering"},{"disc_gen_id":3,"disc_gen_name":"Medical"},{"disc_gen_id":5,"disc_gen_name":"Science"},{"disc_gen_id":7,"disc_gen_name":"Marketing"},{"disc_gen_id":8,"disc_gen_name":"Other"},{"disc_gen_id":9,"disc_gen_name":"Social 287 | Sciences"}],"specific_disciplines":[{"disc_spec_id":41,"disc_spec_name":"Engineering: 288 | Industrial","expertise_level":"specialty"},{"disc_spec_id":34,"disc_spec_name":"Electronics 289 | \/ Elect Eng","expertise_level":"specialty"},{"disc_spec_id":95,"disc_spec_name":"Medical 290 | (general)","expertise_level":"specialty"},{"disc_spec_id":93,"disc_spec_name":"Medical: 291 | Instruments","expertise_level":"specialty"},{"disc_spec_id":67,"disc_spec_name":"Human 292 | Resources","expertise_level":"specialty"},{"disc_spec_id":147,"disc_spec_name":"Computers 293 | (general)","expertise_level":"specialty"},{"disc_spec_id":137,"disc_spec_name":"Telecom(munications)","expertise_level":"specialty"},{"disc_spec_id":40,"disc_spec_name":"Engineering 294 | (general)","expertise_level":"specialty"},{"disc_spec_id":28,"disc_spec_name":"Cooking 295 | \/ Culinary","expertise_level":"specialty"},{"disc_spec_id":51,"disc_spec_name":"Food 296 | \u0026 Drink","expertise_level":"specialty"},{"disc_spec_id":25,"disc_spec_name":"Computers: 297 | Systems, Networks","expertise_level":"working"},{"disc_spec_id":26,"disc_spec_name":"Construction 298 | \/ Civil Engineering","expertise_level":"working"},{"disc_spec_id":23,"disc_spec_name":"Computers: 299 | Hardware","expertise_level":"working"},{"disc_spec_id":9,"disc_spec_name":"Automotive 300 | \/ Cars \u0026 Trucks","expertise_level":"working"},{"disc_spec_id":7,"disc_spec_name":"Art, 301 | Arts \u0026 Crafts, Painting","expertise_level":"working"},{"disc_spec_id":3,"disc_spec_name":"Agriculture","expertise_level":"working"},{"disc_spec_id":16,"disc_spec_name":"Medical: 302 | Cardiology","expertise_level":"working"},{"disc_spec_id":68,"disc_spec_name":"IT 303 | (Information Technology)","expertise_level":"working"},{"disc_spec_id":24,"disc_spec_name":"Computers: 304 | Software","expertise_level":"working"},{"disc_spec_id":20,"disc_spec_name":"Cinema, 305 | Film, TV, Drama","expertise_level":"working"},{"disc_spec_id":2,"disc_spec_name":"Advertising 306 | \/ Public Relations","expertise_level":"working"},{"disc_spec_id":157,"disc_spec_name":"Manufacturing","expertise_level":"working"},{"disc_spec_id":154,"disc_spec_name":"Journalism","expertise_level":"working"},{"disc_spec_id":143,"disc_spec_name":"Wine 307 | \/ Oenology \/ Viticulture","expertise_level":"working"},{"disc_spec_id":139,"disc_spec_name":"Tourism 308 | \u0026 Travel","expertise_level":"working"},{"disc_spec_id":138,"disc_spec_name":"Textiles 309 | \/ Clothing \/ Fashion","expertise_level":"working"},{"disc_spec_id":88,"disc_spec_name":"Materials 310 | (Plastics, Ceramics, etc.)","expertise_level":"working"},{"disc_spec_id":87,"disc_spec_name":"Marketing 311 | \/ Market Research","expertise_level":"working"},{"disc_spec_id":71,"disc_spec_name":"Internet, 312 | e-Commerce","expertise_level":"working"},{"disc_spec_id":62,"disc_spec_name":"Government 313 | \/ Politics","expertise_level":"working"},{"disc_spec_id":57,"disc_spec_name":"General 314 | \/ Conversation \/ Greetings \/ Letters","expertise_level":"working"},{"disc_spec_id":53,"disc_spec_name":"Furniture 315 | \/ Household Appliances","expertise_level":"working"},{"disc_spec_id":50,"disc_spec_name":"Folklore","expertise_level":"working"},{"disc_spec_id":44,"disc_spec_name":"Environment 316 | \u0026 Ecology","expertise_level":"working"},{"disc_spec_id":90,"disc_spec_name":"Mechanics 317 | \/ Mech Engineering","expertise_level":"working"},{"disc_spec_id":91,"disc_spec_name":"Media 318 | \/ Multimedia","expertise_level":"working"},{"disc_spec_id":99,"disc_spec_name":"Mining 319 | \u0026 Minerals \/ Gems","expertise_level":"working"},{"disc_spec_id":97,"disc_spec_name":"Metrology","expertise_level":"working"},{"disc_spec_id":94,"disc_spec_name":"Medical: 320 | Health Care","expertise_level":"working"},{"disc_spec_id":135,"disc_spec_name":"Surveying","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"3498"}}]}' 321 | http_version: 322 | recorded_at: Wed, 04 Feb 2015 03:06:43 GMT 323 | recorded_with: VCR 2.9.3 324 | -------------------------------------------------------------------------------- /spec/fixtures/vcr_cassettes/match_query_options.yml: -------------------------------------------------------------------------------- 1 | --- 2 | http_interactions: 3 | - request: 4 | method: get 5 | uri: https://api.proz.com/v2/freelancer-matches?country_code=us&language_pair=eng_esl&min_yrs_proz=10 6 | body: 7 | encoding: US-ASCII 8 | string: '' 9 | headers: 10 | X-Proz-Api-Key: 11 | - xxxxxxxxx 12 | response: 13 | status: 14 | code: 200 15 | message: OK 16 | headers: 17 | Date: 18 | - Wed, 04 Feb 2015 05:08:08 GMT 19 | Server: 20 | - Apache 21 | Cache-Control: 22 | - no-cache 23 | Transfer-Encoding: 24 | - chunked 25 | Content-Type: 26 | - application/json 27 | body: 28 | encoding: UTF-8 29 | string: '{"success":1,"meta":{"num_results":2704},"data":[{"freelancer":{"uuid":"b9eade6d-33ac-4c7d-b6f1-42905375fc0b","site_name":"Jorge 30 | Arteaga M.D.","profile_url":"http:\/\/www.proz.com\/profile\/45863","contact_info":{"first_name":"Jorge","middle_name":"","last_name":"Arteaga 31 | M.D."},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 32 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]},{"pair_code":"esl_eng","pair_name":"Spanish 33 | to English","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]},{"pair_code":"esl_esl","pair_name":"Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":6,"service_name":"Summarization"},{"service_id":11,"service_name":"Transcription"}]}],"general_disciplines":[{"disc_gen_id":3,"disc_gen_name":"Medical"},{"disc_gen_id":5,"disc_gen_name":"Science"},{"disc_gen_id":7,"disc_gen_name":"Marketing"}],"specific_disciplines":[{"disc_spec_id":95,"disc_spec_name":"Medical 34 | (general)","expertise_level":"specialty"},{"disc_spec_id":92,"disc_spec_name":"Medical: 35 | Pharmaceuticals","expertise_level":"specialty"},{"disc_spec_id":16,"disc_spec_name":"Medical: 36 | Cardiology","expertise_level":"specialty"},{"disc_spec_id":94,"disc_spec_name":"Medical: 37 | Health Care","expertise_level":"specialty"},{"disc_spec_id":120,"disc_spec_name":"Psychology","expertise_level":"specialty"},{"disc_spec_id":104,"disc_spec_name":"Nutrition","expertise_level":"specialty"},{"disc_spec_id":160,"disc_spec_name":"Genetics","expertise_level":"specialty"},{"disc_spec_id":128,"disc_spec_name":"Science 38 | (general)","expertise_level":"working"},{"disc_spec_id":113,"disc_spec_name":"Photography\/Imaging 39 | (\u0026 Graphic Arts)","expertise_level":"working"},{"disc_spec_id":30,"disc_spec_name":"Medical: 40 | Dentistry","expertise_level":"working"},{"disc_spec_id":12,"disc_spec_name":"Biology 41 | (-tech,-chem,micro-)","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"997"}},{"freelancer":{"uuid":"394e1dc0-01fc-4937-8d66-1b477eeb14b7","site_name":"Ltemes","profile_url":"http:\/\/www.proz.com\/profile\/70020","contact_info":{},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 42 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":11,"service_name":"Transcription"}]},{"pair_code":"esl_eng","pair_name":"Spanish 43 | to English","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":11,"service_name":"Transcription"}]},{"pair_code":"esl_esl","pair_name":"Spanish","services":[{"service_id":11,"service_name":"Transcription"}]}],"general_disciplines":[{"disc_gen_id":2,"disc_gen_name":"Art\/Literary"},{"disc_gen_id":3,"disc_gen_name":"Medical"},{"disc_gen_id":4,"disc_gen_name":"Law\/Patents"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":7,"disc_gen_name":"Marketing"},{"disc_gen_id":9,"disc_gen_name":"Social 44 | Sciences"}],"specific_disciplines":[{"disc_spec_id":7,"disc_spec_name":"Art, 45 | Arts \u0026 Crafts, Painting","expertise_level":"specialty"},{"disc_spec_id":71,"disc_spec_name":"Internet, 46 | e-Commerce","expertise_level":"specialty"},{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 47 | (general)","expertise_level":"specialty"},{"disc_spec_id":87,"disc_spec_name":"Marketing 48 | \/ Market Research","expertise_level":"specialty"},{"disc_spec_id":77,"disc_spec_name":"Law 49 | (general)","expertise_level":"specialty"},{"disc_spec_id":122,"disc_spec_name":"Real 50 | Estate","expertise_level":"specialty"},{"disc_spec_id":62,"disc_spec_name":"Government 51 | \/ Politics","expertise_level":"specialty"},{"disc_spec_id":70,"disc_spec_name":"International 52 | Org\/Dev\/Coop","expertise_level":"specialty"},{"disc_spec_id":95,"disc_spec_name":"Medical 53 | (general)","expertise_level":"specialty"},{"disc_spec_id":48,"disc_spec_name":"Finance 54 | (general)","expertise_level":"working"},{"disc_spec_id":2,"disc_spec_name":"Advertising 55 | \/ Public Relations","expertise_level":"working"},{"disc_spec_id":75,"disc_spec_name":"Law: 56 | Contract(s)","expertise_level":"working"},{"disc_spec_id":139,"disc_spec_name":"Tourism 57 | \u0026 Travel","expertise_level":"working"},{"disc_spec_id":94,"disc_spec_name":"Medical: 58 | Health Care","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"2075"}},{"freelancer":{"uuid":"a8f31b88-ef10-4c2f-944f-2f7b8e7e5c4b","site_name":"Soledad 59 | Ca\u00f1o","profile_url":"http:\/\/www.proz.com\/profile\/94130","contact_info":{"first_name":"Soledad","middle_name":"","last_name":"Ca\u00f1o"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 60 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 61 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"},{"service_id":8,"service_name":"Interpreting, 62 | Chuchotage\/Whispering"}]},{"pair_code":"esl_esl","pair_name":"Spanish","services":[]},{"pair_code":"eng_eng","pair_name":"English","services":[{"service_id":2,"service_name":"Checking\/editing"}]}],"general_disciplines":[{"disc_gen_id":2,"disc_gen_name":"Art\/Literary"},{"disc_gen_id":3,"disc_gen_name":"Medical"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":7,"disc_gen_name":"Marketing"},{"disc_gen_id":8,"disc_gen_name":"Other"},{"disc_gen_id":9,"disc_gen_name":"Social 63 | Sciences"}],"specific_disciplines":[{"disc_spec_id":154,"disc_spec_name":"Journalism","expertise_level":"specialty"},{"disc_spec_id":112,"disc_spec_name":"Philosophy","expertise_level":"specialty"},{"disc_spec_id":130,"disc_spec_name":"Social 64 | Science, Sociology, Ethics, etc.","expertise_level":"specialty"},{"disc_spec_id":33,"disc_spec_name":"Education 65 | \/ Pedagogy","expertise_level":"specialty"},{"disc_spec_id":65,"disc_spec_name":"History","expertise_level":"specialty"},{"disc_spec_id":87,"disc_spec_name":"Marketing 66 | \/ Market Research","expertise_level":"specialty"},{"disc_spec_id":120,"disc_spec_name":"Psychology","expertise_level":"specialty"},{"disc_spec_id":89,"disc_spec_name":"Mathematics 67 | \u0026 Statistics","expertise_level":"specialty"},{"disc_spec_id":92,"disc_spec_name":"Medical: 68 | Pharmaceuticals","expertise_level":"specialty"},{"disc_spec_id":24,"disc_spec_name":"Computers: 69 | Software","expertise_level":"specialty"},{"disc_spec_id":95,"disc_spec_name":"Medical 70 | (general)","expertise_level":"working"},{"disc_spec_id":122,"disc_spec_name":"Real 71 | Estate","expertise_level":"working"},{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 72 | (general)","expertise_level":"working"},{"disc_spec_id":68,"disc_spec_name":"IT 73 | (Information Technology)","expertise_level":"working"},{"disc_spec_id":25,"disc_spec_name":"Computers: 74 | Systems, Networks","expertise_level":"working"},{"disc_spec_id":23,"disc_spec_name":"Computers: 75 | Hardware","expertise_level":"working"},{"disc_spec_id":67,"disc_spec_name":"Human 76 | Resources","expertise_level":"working"},{"disc_spec_id":105,"disc_spec_name":"Other","expertise_level":"working"},{"disc_spec_id":94,"disc_spec_name":"Medical: 77 | Health Care","expertise_level":"working"},{"disc_spec_id":104,"disc_spec_name":"Nutrition","expertise_level":"working"},{"disc_spec_id":6,"disc_spec_name":"Architecture","expertise_level":"working"},{"disc_spec_id":135,"disc_spec_name":"Surveying","expertise_level":"working"},{"disc_spec_id":48,"disc_spec_name":"Finance 78 | (general)","expertise_level":"working"},{"disc_spec_id":91,"disc_spec_name":"Media 79 | \/ Multimedia","expertise_level":"working"},{"disc_spec_id":44,"disc_spec_name":"Environment 80 | \u0026 Ecology","expertise_level":"working"},{"disc_spec_id":147,"disc_spec_name":"Computers 81 | (general)","expertise_level":"working"},{"disc_spec_id":5,"disc_spec_name":"Anthropology","expertise_level":"working"},{"disc_spec_id":57,"disc_spec_name":"General 82 | \/ Conversation \/ Greetings \/ Letters","expertise_level":"working"},{"disc_spec_id":2,"disc_spec_name":"Advertising 83 | \/ Public Relations","expertise_level":"working"},{"disc_spec_id":62,"disc_spec_name":"Government 84 | \/ Politics","expertise_level":"working"},{"disc_spec_id":70,"disc_spec_name":"International 85 | Org\/Dev\/Coop","expertise_level":"working"},{"disc_spec_id":123,"disc_spec_name":"Religion","expertise_level":"working"},{"disc_spec_id":124,"disc_spec_name":"Retail","expertise_level":"working"},{"disc_spec_id":71,"disc_spec_name":"Internet, 86 | e-Commerce","expertise_level":"working"},{"disc_spec_id":85,"disc_spec_name":"Management","expertise_level":"working"},{"disc_spec_id":128,"disc_spec_name":"Science 87 | (general)","expertise_level":"working"},{"disc_spec_id":32,"disc_spec_name":"Economics","expertise_level":"working"},{"disc_spec_id":139,"disc_spec_name":"Tourism 88 | \u0026 Travel","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"795"}},{"freelancer":{"uuid":"0ca6a7bc-6e97-44af-b87d-860b503c0757","site_name":"Luis 89 | Arri Cibils","profile_url":"http:\/\/www.proz.com\/profile\/39041","contact_info":{"first_name":"Luis","middle_name":"","last_name":"Arri 90 | Cibils"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 91 | to Spanish","services":[{"service_id":1,"service_name":"Translation"}]},{"pair_code":"esl_eng","pair_name":"Spanish 92 | to English","services":[{"service_id":1,"service_name":"Translation"}]}],"general_disciplines":[{"disc_gen_id":1,"disc_gen_name":"Tech\/Engineering"},{"disc_gen_id":4,"disc_gen_name":"Law\/Patents"},{"disc_gen_id":5,"disc_gen_name":"Science"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"}],"specific_disciplines":[{"disc_spec_id":170,"disc_spec_name":"Patents","expertise_level":"specialty"},{"disc_spec_id":110,"disc_spec_name":"Petroleum 93 | Eng\/Sci","expertise_level":"specialty"},{"disc_spec_id":77,"disc_spec_name":"Law 94 | (general)","expertise_level":"specialty"},{"disc_spec_id":76,"disc_spec_name":"Law: 95 | Patents, Trademarks, Copyright","expertise_level":"specialty"},{"disc_spec_id":75,"disc_spec_name":"Law: 96 | Contract(s)","expertise_level":"specialty"},{"disc_spec_id":72,"disc_spec_name":"Investment 97 | \/ Securities","expertise_level":"specialty"},{"disc_spec_id":48,"disc_spec_name":"Finance 98 | (general)","expertise_level":"specialty"},{"disc_spec_id":40,"disc_spec_name":"Engineering 99 | (general)","expertise_level":"specialty"},{"disc_spec_id":19,"disc_spec_name":"Chemistry; 100 | Chem Sci\/Eng","expertise_level":"specialty"},{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 101 | (general)","expertise_level":"specialty"},{"disc_spec_id":90,"disc_spec_name":"Mechanics 102 | \/ Mech Engineering","expertise_level":"working"},{"disc_spec_id":33,"disc_spec_name":"Education 103 | \/ Pedagogy","expertise_level":"working"},{"disc_spec_id":32,"disc_spec_name":"Economics","expertise_level":"working"},{"disc_spec_id":26,"disc_spec_name":"Construction 104 | \/ Civil Engineering","expertise_level":"working"},{"disc_spec_id":25,"disc_spec_name":"Computers: 105 | Systems, Networks","expertise_level":"working"},{"disc_spec_id":24,"disc_spec_name":"Computers: 106 | Software","expertise_level":"working"},{"disc_spec_id":12,"disc_spec_name":"Biology 107 | (-tech,-chem,micro-)","expertise_level":"working"},{"disc_spec_id":1,"disc_spec_name":"Accounting","expertise_level":"working"},{"disc_spec_id":35,"disc_spec_name":"Energy 108 | \/ Power Generation","expertise_level":"working"},{"disc_spec_id":41,"disc_spec_name":"Engineering: 109 | Industrial","expertise_level":"working"},{"disc_spec_id":89,"disc_spec_name":"Mathematics 110 | \u0026 Statistics","expertise_level":"working"},{"disc_spec_id":88,"disc_spec_name":"Materials 111 | (Plastics, Ceramics, etc.)","expertise_level":"working"},{"disc_spec_id":85,"disc_spec_name":"Management","expertise_level":"working"},{"disc_spec_id":71,"disc_spec_name":"Internet, 112 | e-Commerce","expertise_level":"working"},{"disc_spec_id":70,"disc_spec_name":"International 113 | Org\/Dev\/Coop","expertise_level":"working"},{"disc_spec_id":69,"disc_spec_name":"Insurance","expertise_level":"working"},{"disc_spec_id":62,"disc_spec_name":"Government 114 | \/ Politics","expertise_level":"working"},{"disc_spec_id":51,"disc_spec_name":"Food 115 | \u0026 Drink","expertise_level":"working"},{"disc_spec_id":44,"disc_spec_name":"Environment 116 | \u0026 Ecology","expertise_level":"working"},{"disc_spec_id":104,"disc_spec_name":"Nutrition","expertise_level":"working"},{"disc_spec_id":92,"disc_spec_name":"Medical: 117 | Pharmaceuticals","expertise_level":"working"},{"disc_spec_id":158,"disc_spec_name":"Certificates, 118 | Diplomas, Licenses, CVs","expertise_level":"working"},{"disc_spec_id":157,"disc_spec_name":"Manufacturing","expertise_level":"working"},{"disc_spec_id":147,"disc_spec_name":"Computers 119 | (general)","expertise_level":"working"},{"disc_spec_id":140,"disc_spec_name":"Transport 120 | \/ Transportation \/ Shipping","expertise_level":"working"},{"disc_spec_id":128,"disc_spec_name":"Science 121 | (general)","expertise_level":"working"},{"disc_spec_id":122,"disc_spec_name":"Real 122 | Estate","expertise_level":"working"},{"disc_spec_id":107,"disc_spec_name":"Paper 123 | \/ Paper Manufacturing","expertise_level":"working"},{"disc_spec_id":96,"disc_spec_name":"Metallurgy 124 | \/ Casting","expertise_level":"working"},{"disc_spec_id":94,"disc_spec_name":"Medical: 125 | Health Care","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"619"}},{"freelancer":{"uuid":"4b68ad69-5f3a-4cdc-b64c-05da6c93051b","site_name":"\u00d3scar 126 | Delgado Gos\u00e1lvez","profile_url":"http:\/\/www.proz.com\/profile\/25731","contact_info":{"first_name":"\u00d3scar","middle_name":"","last_name":"Delgado 127 | Gos\u00e1lvez"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 128 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 129 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"},{"service_id":8,"service_name":"Interpreting, 130 | Chuchotage\/Whispering"},{"service_id":10,"service_name":"Interpreting, Phone"},{"service_id":11,"service_name":"Transcription"}]},{"pair_code":"esl_eng","pair_name":"Spanish 131 | to English","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 132 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":7,"service_name":"Education"},{"service_id":8,"service_name":"Interpreting, 133 | Chuchotage\/Whispering"}]},{"pair_code":"dut_esl","pair_name":"Dutch to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 134 | Consecutive"},{"service_id":7,"service_name":"Education"},{"service_id":8,"service_name":"Interpreting, 135 | Chuchotage\/Whispering"}]},{"pair_code":"deu_esl","pair_name":"German to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]},{"pair_code":"ron_esl","pair_name":"Romanian 136 | to Spanish","services":[{"service_id":1,"service_name":"Translation"}]},{"pair_code":"esl_esl","pair_name":"Spanish","services":[{"service_id":2,"service_name":"Checking\/editing"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"},{"service_id":11,"service_name":"Transcription"}]},{"pair_code":"eng_eng","pair_name":"English","services":[{"service_id":7,"service_name":"Education"}]}],"general_disciplines":[{"disc_gen_id":2,"disc_gen_name":"Art\/Literary"},{"disc_gen_id":4,"disc_gen_name":"Law\/Patents"},{"disc_gen_id":5,"disc_gen_name":"Science"},{"disc_gen_id":9,"disc_gen_name":"Social 137 | Sciences"}],"specific_disciplines":[{"disc_spec_id":77,"disc_spec_name":"Law 138 | (general)","expertise_level":"specialty"},{"disc_spec_id":75,"disc_spec_name":"Law: 139 | Contract(s)","expertise_level":"specialty"},{"disc_spec_id":76,"disc_spec_name":"Law: 140 | Patents, Trademarks, Copyright","expertise_level":"specialty"},{"disc_spec_id":32,"disc_spec_name":"Economics","expertise_level":"specialty"},{"disc_spec_id":62,"disc_spec_name":"Government 141 | \/ Politics","expertise_level":"specialty"},{"disc_spec_id":70,"disc_spec_name":"International 142 | Org\/Dev\/Coop","expertise_level":"specialty"},{"disc_spec_id":85,"disc_spec_name":"Management","expertise_level":"specialty"},{"disc_spec_id":98,"disc_spec_name":"Military 143 | \/ Defense","expertise_level":"specialty"},{"disc_spec_id":44,"disc_spec_name":"Environment 144 | \u0026 Ecology","expertise_level":"specialty"},{"disc_spec_id":35,"disc_spec_name":"Energy 145 | \/ Power Generation","expertise_level":"specialty"},{"disc_spec_id":48,"disc_spec_name":"Finance 146 | (general)","expertise_level":"working"},{"disc_spec_id":10,"disc_spec_name":"Aerospace 147 | \/ Aviation \/ Space","expertise_level":"working"},{"disc_spec_id":138,"disc_spec_name":"Textiles 148 | \/ Clothing \/ Fashion","expertise_level":"working"},{"disc_spec_id":136,"disc_spec_name":"Law: 149 | Taxation \u0026 Customs","expertise_level":"working"},{"disc_spec_id":103,"disc_spec_name":"Nuclear 150 | Eng\/Sci","expertise_level":"working"},{"disc_spec_id":94,"disc_spec_name":"Medical: 151 | Health Care","expertise_level":"working"},{"disc_spec_id":60,"disc_spec_name":"Geography","expertise_level":"working"},{"disc_spec_id":80,"disc_spec_name":"Linguistics","expertise_level":"working"},{"disc_spec_id":57,"disc_spec_name":"General 152 | \/ Conversation \/ Greetings \/ Letters","expertise_level":"working"},{"disc_spec_id":152,"disc_spec_name":"Idioms 153 | \/ Maxims \/ Sayings","expertise_level":"working"},{"disc_spec_id":5,"disc_spec_name":"Anthropology","expertise_level":"working"},{"disc_spec_id":65,"disc_spec_name":"History","expertise_level":"working"},{"disc_spec_id":112,"disc_spec_name":"Philosophy","expertise_level":"working"},{"disc_spec_id":130,"disc_spec_name":"Social 154 | Science, Sociology, Ethics, etc.","expertise_level":"working"},{"disc_spec_id":154,"disc_spec_name":"Journalism","expertise_level":"working"},{"disc_spec_id":149,"disc_spec_name":"Slang","expertise_level":"working"},{"disc_spec_id":140,"disc_spec_name":"Transport 155 | \/ Transportation \/ Shipping","expertise_level":"working"},{"disc_spec_id":20,"disc_spec_name":"Cinema, 156 | Film, TV, Drama","expertise_level":"working"},{"disc_spec_id":50,"disc_spec_name":"Folklore","expertise_level":"working"},{"disc_spec_id":26,"disc_spec_name":"Construction 157 | \/ Civil Engineering","expertise_level":"working"},{"disc_spec_id":151,"disc_spec_name":"Archaeology","expertise_level":"working"},{"disc_spec_id":7,"disc_spec_name":"Art, 158 | Arts \u0026 Crafts, Painting","expertise_level":"working"},{"disc_spec_id":113,"disc_spec_name":"Photography\/Imaging 159 | (\u0026 Graphic Arts)","expertise_level":"working"},{"disc_spec_id":33,"disc_spec_name":"Education 160 | \/ Pedagogy","expertise_level":"working"},{"disc_spec_id":158,"disc_spec_name":"Certificates, 161 | Diplomas, Licenses, CVs","expertise_level":"working"},{"disc_spec_id":90,"disc_spec_name":"Mechanics 162 | \/ Mech Engineering","expertise_level":"working"},{"disc_spec_id":110,"disc_spec_name":"Petroleum 163 | Eng\/Sci","expertise_level":"working"},{"disc_spec_id":67,"disc_spec_name":"Human 164 | Resources","expertise_level":"working"},{"disc_spec_id":128,"disc_spec_name":"Science 165 | (general)","expertise_level":"working"},{"disc_spec_id":82,"disc_spec_name":"Poetry 166 | \u0026 Literature","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"301"}},{"freelancer":{"uuid":"90a7a310-3aa6-431e-aaf5-f03c067f50dd","site_name":"Marialba 167 | Baez","profile_url":"http:\/\/www.proz.com\/profile\/41402","contact_info":{"first_name":"Marialba","middle_name":"","last_name":"Baez"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 168 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 169 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"},{"service_id":8,"service_name":"Interpreting, 170 | Chuchotage\/Whispering"}]}],"general_disciplines":[{"disc_gen_id":1,"disc_gen_name":"Tech\/Engineering"},{"disc_gen_id":3,"disc_gen_name":"Medical"},{"disc_gen_id":5,"disc_gen_name":"Science"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":7,"disc_gen_name":"Marketing"}],"specific_disciplines":[{"disc_spec_id":2,"disc_spec_name":"Advertising 171 | \/ Public Relations","expertise_level":"specialty"},{"disc_spec_id":30,"disc_spec_name":"Medical: 172 | Dentistry","expertise_level":"specialty"},{"disc_spec_id":33,"disc_spec_name":"Education 173 | \/ Pedagogy","expertise_level":"specialty"},{"disc_spec_id":41,"disc_spec_name":"Engineering: 174 | Industrial","expertise_level":"specialty"},{"disc_spec_id":139,"disc_spec_name":"Tourism 175 | \u0026 Travel","expertise_level":"specialty"},{"disc_spec_id":94,"disc_spec_name":"Medical: 176 | Health Care","expertise_level":"specialty"},{"disc_spec_id":92,"disc_spec_name":"Medical: 177 | Pharmaceuticals","expertise_level":"specialty"},{"disc_spec_id":69,"disc_spec_name":"Insurance","expertise_level":"specialty"},{"disc_spec_id":57,"disc_spec_name":"General 178 | \/ Conversation \/ Greetings \/ Letters","expertise_level":"specialty"},{"disc_spec_id":48,"disc_spec_name":"Finance 179 | (general)","expertise_level":"specialty"},{"disc_spec_id":123,"disc_spec_name":"Religion","expertise_level":"working"},{"disc_spec_id":122,"disc_spec_name":"Real 180 | Estate","expertise_level":"working"},{"disc_spec_id":120,"disc_spec_name":"Psychology","expertise_level":"working"},{"disc_spec_id":119,"disc_spec_name":"Printing 181 | \u0026 Publishing","expertise_level":"working"},{"disc_spec_id":104,"disc_spec_name":"Nutrition","expertise_level":"working"},{"disc_spec_id":98,"disc_spec_name":"Military 182 | \/ Defense","expertise_level":"working"},{"disc_spec_id":95,"disc_spec_name":"Medical 183 | (general)","expertise_level":"working"},{"disc_spec_id":93,"disc_spec_name":"Medical: 184 | Instruments","expertise_level":"working"},{"disc_spec_id":91,"disc_spec_name":"Media 185 | \/ Multimedia","expertise_level":"working"},{"disc_spec_id":124,"disc_spec_name":"Retail","expertise_level":"working"},{"disc_spec_id":128,"disc_spec_name":"Science 186 | (general)","expertise_level":"working"},{"disc_spec_id":157,"disc_spec_name":"Manufacturing","expertise_level":"working"},{"disc_spec_id":154,"disc_spec_name":"Journalism","expertise_level":"working"},{"disc_spec_id":140,"disc_spec_name":"Transport 187 | \/ Transportation \/ Shipping","expertise_level":"working"},{"disc_spec_id":137,"disc_spec_name":"Telecom(munications)","expertise_level":"working"},{"disc_spec_id":133,"disc_spec_name":"Sports 188 | \/ Fitness \/ Recreation","expertise_level":"working"},{"disc_spec_id":130,"disc_spec_name":"Social 189 | Science, Sociology, Ethics, etc.","expertise_level":"working"},{"disc_spec_id":87,"disc_spec_name":"Marketing 190 | \/ Market Research","expertise_level":"working"},{"disc_spec_id":82,"disc_spec_name":"Poetry 191 | \u0026 Literature","expertise_level":"working"},{"disc_spec_id":77,"disc_spec_name":"Law 192 | (general)","expertise_level":"working"},{"disc_spec_id":20,"disc_spec_name":"Cinema, 193 | Film, TV, Drama","expertise_level":"working"},{"disc_spec_id":24,"disc_spec_name":"Computers: 194 | Software","expertise_level":"working"},{"disc_spec_id":75,"disc_spec_name":"Law: 195 | Contract(s)","expertise_level":"working"},{"disc_spec_id":72,"disc_spec_name":"Investment 196 | \/ Securities","expertise_level":"working"},{"disc_spec_id":67,"disc_spec_name":"Human 197 | Resources","expertise_level":"working"},{"disc_spec_id":62,"disc_spec_name":"Government 198 | \/ Politics","expertise_level":"working"},{"disc_spec_id":40,"disc_spec_name":"Engineering 199 | (general)","expertise_level":"working"},{"disc_spec_id":34,"disc_spec_name":"Electronics 200 | \/ Elect Eng","expertise_level":"working"},{"disc_spec_id":32,"disc_spec_name":"Economics","expertise_level":"working"},{"disc_spec_id":28,"disc_spec_name":"Cooking 201 | \/ Culinary","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"247"}},{"freelancer":{"uuid":"6723f775-a580-4719-a596-617396b60816","site_name":"Sayda 202 | Pineda","profile_url":"http:\/\/www.proz.com\/profile\/99009","contact_info":{"first_name":"Sayda","middle_name":"Miriam","last_name":"Pineda"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 203 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 204 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"},{"service_id":8,"service_name":"Interpreting, 205 | Chuchotage\/Whispering"}]}],"general_disciplines":[{"disc_gen_id":1,"disc_gen_name":"Tech\/Engineering"},{"disc_gen_id":2,"disc_gen_name":"Art\/Literary"},{"disc_gen_id":4,"disc_gen_name":"Law\/Patents"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":7,"disc_gen_name":"Marketing"}],"specific_disciplines":[{"disc_spec_id":24,"disc_spec_name":"Computers: 206 | Software","expertise_level":"specialty"},{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 207 | (general)","expertise_level":"specialty"},{"disc_spec_id":2,"disc_spec_name":"Advertising 208 | \/ Public Relations","expertise_level":"specialty"},{"disc_spec_id":9,"disc_spec_name":"Automotive 209 | \/ Cars \u0026 Trucks","expertise_level":"specialty"},{"disc_spec_id":41,"disc_spec_name":"Engineering: 210 | Industrial","expertise_level":"specialty"},{"disc_spec_id":67,"disc_spec_name":"Human 211 | Resources","expertise_level":"specialty"},{"disc_spec_id":77,"disc_spec_name":"Law 212 | (general)","expertise_level":"specialty"},{"disc_spec_id":110,"disc_spec_name":"Petroleum 213 | Eng\/Sci","expertise_level":"specialty"},{"disc_spec_id":157,"disc_spec_name":"Manufacturing","expertise_level":"specialty"},{"disc_spec_id":87,"disc_spec_name":"Marketing 214 | \/ Market Research","expertise_level":"specialty"},{"disc_spec_id":26,"disc_spec_name":"Construction 215 | \/ Civil Engineering","expertise_level":"working"},{"disc_spec_id":40,"disc_spec_name":"Engineering 216 | (general)","expertise_level":"working"},{"disc_spec_id":7,"disc_spec_name":"Art, 217 | Arts \u0026 Crafts, Painting","expertise_level":"working"},{"disc_spec_id":34,"disc_spec_name":"Electronics 218 | \/ Elect Eng","expertise_level":"working"},{"disc_spec_id":33,"disc_spec_name":"Education 219 | \/ Pedagogy","expertise_level":"working"},{"disc_spec_id":32,"disc_spec_name":"Economics","expertise_level":"working"},{"disc_spec_id":53,"disc_spec_name":"Furniture 220 | \/ Household Appliances","expertise_level":"working"},{"disc_spec_id":65,"disc_spec_name":"History","expertise_level":"working"},{"disc_spec_id":68,"disc_spec_name":"IT 221 | (Information Technology)","expertise_level":"working"},{"disc_spec_id":71,"disc_spec_name":"Internet, 222 | e-Commerce","expertise_level":"working"},{"disc_spec_id":122,"disc_spec_name":"Real 223 | Estate","expertise_level":"working"},{"disc_spec_id":135,"disc_spec_name":"Surveying","expertise_level":"working"},{"disc_spec_id":136,"disc_spec_name":"Law: 224 | Taxation \u0026 Customs","expertise_level":"working"},{"disc_spec_id":137,"disc_spec_name":"Telecom(munications)","expertise_level":"working"},{"disc_spec_id":139,"disc_spec_name":"Tourism 225 | \u0026 Travel","expertise_level":"working"},{"disc_spec_id":140,"disc_spec_name":"Transport 226 | \/ Transportation \/ Shipping","expertise_level":"working"},{"disc_spec_id":147,"disc_spec_name":"Computers 227 | (general)","expertise_level":"working"},{"disc_spec_id":119,"disc_spec_name":"Printing 228 | \u0026 Publishing","expertise_level":"working"},{"disc_spec_id":75,"disc_spec_name":"Law: 229 | Contract(s)","expertise_level":"working"},{"disc_spec_id":76,"disc_spec_name":"Law: 230 | Patents, Trademarks, Copyright","expertise_level":"working"},{"disc_spec_id":82,"disc_spec_name":"Poetry 231 | \u0026 Literature","expertise_level":"working"},{"disc_spec_id":85,"disc_spec_name":"Management","expertise_level":"working"},{"disc_spec_id":90,"disc_spec_name":"Mechanics 232 | \/ Mech Engineering","expertise_level":"working"},{"disc_spec_id":92,"disc_spec_name":"Medical: 233 | Pharmaceuticals","expertise_level":"working"},{"disc_spec_id":95,"disc_spec_name":"Medical 234 | (general)","expertise_level":"working"},{"disc_spec_id":98,"disc_spec_name":"Military 235 | \/ Defense","expertise_level":"working"},{"disc_spec_id":57,"disc_spec_name":"General 236 | \/ Conversation \/ Greetings \/ Letters","expertise_level":"working"},{"disc_spec_id":48,"disc_spec_name":"Finance 237 | (general)","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"168"}},{"freelancer":{"uuid":"cf02214c-acc3-432d-b7d5-4aaf1220d1fe","site_name":"Luisa 238 | Ramos, CT","profile_url":"http:\/\/www.proz.com\/profile\/70945","contact_info":{"first_name":"Luisa","middle_name":"M","last_name":"Ramos, 239 | CT"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 240 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 241 | Consecutive"},{"service_id":10,"service_name":"Interpreting, Phone"},{"service_id":11,"service_name":"Transcription"}]},{"pair_code":"esl_eng","pair_name":"Spanish 242 | to English","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"}]}],"general_disciplines":[{"disc_gen_id":2,"disc_gen_name":"Art\/Literary"},{"disc_gen_id":3,"disc_gen_name":"Medical"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":9,"disc_gen_name":"Social 243 | Sciences"}],"specific_disciplines":[{"disc_spec_id":67,"disc_spec_name":"Human 244 | Resources","expertise_level":"specialty"},{"disc_spec_id":94,"disc_spec_name":"Medical: 245 | Health Care","expertise_level":"specialty"},{"disc_spec_id":69,"disc_spec_name":"Insurance","expertise_level":"specialty"},{"disc_spec_id":33,"disc_spec_name":"Education 246 | \/ Pedagogy","expertise_level":"specialty"},{"disc_spec_id":77,"disc_spec_name":"Law 247 | (general)","expertise_level":"specialty"},{"disc_spec_id":130,"disc_spec_name":"Social 248 | Science, Sociology, Ethics, etc.","expertise_level":"specialty"},{"disc_spec_id":128,"disc_spec_name":"Science 249 | (general)","expertise_level":"specialty"},{"disc_spec_id":48,"disc_spec_name":"Finance 250 | (general)","expertise_level":"specialty"},{"disc_spec_id":53,"disc_spec_name":"Furniture 251 | \/ Household Appliances","expertise_level":"working"},{"disc_spec_id":60,"disc_spec_name":"Geography","expertise_level":"working"},{"disc_spec_id":62,"disc_spec_name":"Government 252 | \/ Politics","expertise_level":"working"},{"disc_spec_id":65,"disc_spec_name":"History","expertise_level":"working"},{"disc_spec_id":104,"disc_spec_name":"Nutrition","expertise_level":"working"},{"disc_spec_id":68,"disc_spec_name":"IT 253 | (Information Technology)","expertise_level":"working"},{"disc_spec_id":70,"disc_spec_name":"International 254 | Org\/Dev\/Coop","expertise_level":"working"},{"disc_spec_id":51,"disc_spec_name":"Food 255 | \u0026 Drink","expertise_level":"working"},{"disc_spec_id":95,"disc_spec_name":"Medical 256 | (general)","expertise_level":"working"},{"disc_spec_id":72,"disc_spec_name":"Investment 257 | \/ Securities","expertise_level":"working"},{"disc_spec_id":85,"disc_spec_name":"Management","expertise_level":"working"},{"disc_spec_id":124,"disc_spec_name":"Retail","expertise_level":"working"},{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 258 | (general)","expertise_level":"working"},{"disc_spec_id":44,"disc_spec_name":"Environment 259 | \u0026 Ecology","expertise_level":"working"},{"disc_spec_id":92,"disc_spec_name":"Medical: 260 | Pharmaceuticals","expertise_level":"working"},{"disc_spec_id":139,"disc_spec_name":"Tourism 261 | \u0026 Travel","expertise_level":"working"},{"disc_spec_id":24,"disc_spec_name":"Computers: 262 | Software","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"1363"}},{"freelancer":{"uuid":"8f14be4f-4b9b-4872-a14d-01c236a099c0","site_name":"Miguel 263 | Carmona","profile_url":"http:\/\/www.proz.com\/profile\/123619","contact_info":{"first_name":"Miguel","middle_name":"","last_name":"Carmona"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 264 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 265 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"},{"service_id":8,"service_name":"Interpreting, 266 | Chuchotage\/Whispering"}]}],"general_disciplines":[{"disc_gen_id":1,"disc_gen_name":"Tech\/Engineering"}],"specific_disciplines":[{"disc_spec_id":159,"disc_spec_name":"Automation 267 | \u0026 Robotics","expertise_level":"specialty"},{"disc_spec_id":34,"disc_spec_name":"Electronics 268 | \/ Elect Eng","expertise_level":"specialty"},{"disc_spec_id":90,"disc_spec_name":"Mechanics 269 | \/ Mech Engineering","expertise_level":"specialty"},{"disc_spec_id":157,"disc_spec_name":"Manufacturing","expertise_level":"specialty"},{"disc_spec_id":40,"disc_spec_name":"Engineering 270 | (general)","expertise_level":"specialty"},{"disc_spec_id":41,"disc_spec_name":"Engineering: 271 | Industrial","expertise_level":"specialty"},{"disc_spec_id":35,"disc_spec_name":"Energy 272 | \/ Power Generation","expertise_level":"specialty"},{"disc_spec_id":98,"disc_spec_name":"Military 273 | \/ Defense","expertise_level":"working"},{"disc_spec_id":147,"disc_spec_name":"Computers 274 | (general)","expertise_level":"working"},{"disc_spec_id":137,"disc_spec_name":"Telecom(munications)","expertise_level":"working"},{"disc_spec_id":24,"disc_spec_name":"Computers: 275 | Software","expertise_level":"working"},{"disc_spec_id":68,"disc_spec_name":"IT 276 | (Information Technology)","expertise_level":"working"},{"disc_spec_id":25,"disc_spec_name":"Computers: 277 | Systems, Networks","expertise_level":"working"},{"disc_spec_id":9,"disc_spec_name":"Automotive 278 | \/ Cars \u0026 Trucks","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"71"}},{"freelancer":{"uuid":"84fcdc02-ccac-4d39-bc50-230cba598f13","site_name":"Christina 279 | Green","profile_url":"http:\/\/www.proz.com\/profile\/48301","contact_info":{"first_name":"Christina","middle_name":"","last_name":"Green"},"skills":{"language_pairs":[{"pair_code":"eng_esl","pair_name":"English 280 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 281 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"},{"service_id":8,"service_name":"Interpreting, 282 | Chuchotage\/Whispering"}]},{"pair_code":"ita_esl","pair_name":"Italian to 283 | Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 284 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"}]},{"pair_code":"fra_esl","pair_name":"French 285 | to Spanish","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 286 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"}]},{"pair_code":"esl_eng","pair_name":"Spanish 287 | to English","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 288 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"}]},{"pair_code":"esl_ita","pair_name":"Spanish 289 | to Italian","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 290 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"}]},{"pair_code":"esl_fra","pair_name":"Spanish 291 | to French","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 292 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"}]},{"pair_code":"eng_ita","pair_name":"English 293 | to Italian","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 294 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"}]},{"pair_code":"eng_fra","pair_name":"English 295 | to French","services":[{"service_id":1,"service_name":"Translation"},{"service_id":2,"service_name":"Checking\/editing"},{"service_id":3,"service_name":"Interpreting, 296 | Consecutive"},{"service_id":4,"service_name":"Interpreting, Simultaneous"},{"service_id":5,"service_name":"Voiceover"},{"service_id":6,"service_name":"Summarization"},{"service_id":7,"service_name":"Education"}]}],"general_disciplines":[{"disc_gen_id":1,"disc_gen_name":"Tech\/Engineering"},{"disc_gen_id":2,"disc_gen_name":"Art\/Literary"},{"disc_gen_id":3,"disc_gen_name":"Medical"},{"disc_gen_id":4,"disc_gen_name":"Law\/Patents"},{"disc_gen_id":5,"disc_gen_name":"Science"},{"disc_gen_id":6,"disc_gen_name":"Bus\/Financial"},{"disc_gen_id":7,"disc_gen_name":"Marketing"},{"disc_gen_id":8,"disc_gen_name":"Other"},{"disc_gen_id":9,"disc_gen_name":"Social 297 | Sciences"}],"specific_disciplines":[{"disc_spec_id":15,"disc_spec_name":"Business\/Commerce 298 | (general)","expertise_level":"specialty"},{"disc_spec_id":48,"disc_spec_name":"Finance 299 | (general)","expertise_level":"specialty"},{"disc_spec_id":75,"disc_spec_name":"Law: 300 | Contract(s)","expertise_level":"specialty"},{"disc_spec_id":76,"disc_spec_name":"Law: 301 | Patents, Trademarks, Copyright","expertise_level":"specialty"},{"disc_spec_id":77,"disc_spec_name":"Law 302 | (general)","expertise_level":"specialty"},{"disc_spec_id":95,"disc_spec_name":"Medical 303 | (general)","expertise_level":"specialty"},{"disc_spec_id":136,"disc_spec_name":"Law: 304 | Taxation \u0026 Customs","expertise_level":"specialty"},{"disc_spec_id":158,"disc_spec_name":"Certificates, 305 | Diplomas, Licenses, CVs","expertise_level":"specialty"},{"disc_spec_id":92,"disc_spec_name":"Medical: 306 | Pharmaceuticals","expertise_level":"working"},{"disc_spec_id":110,"disc_spec_name":"Petroleum 307 | Eng\/Sci","expertise_level":"working"},{"disc_spec_id":94,"disc_spec_name":"Medical: 308 | Health Care","expertise_level":"working"},{"disc_spec_id":57,"disc_spec_name":"General 309 | \/ Conversation \/ Greetings \/ Letters","expertise_level":"working"},{"disc_spec_id":62,"disc_spec_name":"Government 310 | \/ Politics","expertise_level":"working"},{"disc_spec_id":85,"disc_spec_name":"Management","expertise_level":"working"},{"disc_spec_id":87,"disc_spec_name":"Marketing 311 | \/ Market Research","expertise_level":"working"},{"disc_spec_id":93,"disc_spec_name":"Medical: 312 | Instruments","expertise_level":"working"},{"disc_spec_id":1,"disc_spec_name":"Accounting","expertise_level":"working"}]}},"relevance":{"kudoz_in_pair":"71"}}]}' 313 | http_version: 314 | recorded_at: Wed, 04 Feb 2015 05:08:38 GMT 315 | recorded_with: VCR 2.9.3 316 | --------------------------------------------------------------------------------