├── test └── gapi │ └── test │ └── core.clj ├── .gitignore ├── project.clj ├── README.md ├── src └── gapi │ ├── auth.clj │ └── core.clj └── data ├── apis.json └── plus.json /test/gapi/test/core.clj: -------------------------------------------------------------------------------- 1 | (ns gapi.test.core 2 | (:use [gapi.core]) 3 | (:use [clojure.test])) 4 | 5 | (deftest replace-me ;; FIXME: write 6 | (is false "No tests have been written.")) 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ### Leiningen template 3 | pom.xml 4 | pom.xml.asc 5 | *jar 6 | target/ 7 | .lein-deps-sum 8 | .lein-repl-history 9 | .lein-plugins/ 10 | .lein-failures 11 | .nrepl-port 12 | 13 | 14 | -------------------------------------------------------------------------------- /project.clj: -------------------------------------------------------------------------------- 1 | (defproject gapi "1.0.1" 2 | :description "A simple pure clojure interface for Google web services" 3 | :license {:name "The Apache Software License, Version 2.0" 4 | :url "http://www.apache.org/licenses/LICENSE-2.0"} 5 | :url "https://github.com/ianbarber/clj-gapi" 6 | :dependencies [[org.clojure/clojure "1.5.1"] 7 | [org.clojure/data.json "0.2.6"] 8 | [clj-http "1.1.2"]]) 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | clj-gapi 2 | ========== 3 | 4 | A simple client for Google web service APIs that are described by the discovery document API. See https://developers.google.com/console for a full list of APIs that can be addressed by this. Ensure that a console project has been created for any access you wish to do! 5 | 6 | Installation 7 | ------------------------- 8 | In your `project.clj` file, just include the following dependency: 9 | `[gapi "1.0.1"]` 10 | 11 | Quick Start 12 | ------------------------- 13 | 14 | For very simple API access, you can make an immediate call - in this case to the Google+ API. 15 | 16 | (def auth (gapi.auth/create-auth "YOUR_API_KEY")) 17 | (im auth "plus.activities/search" {"query" "clojure"}) 18 | 19 | Namespace Usage 20 | ------------------------- 21 | 22 | The library can generate a series of functions in a namespace based on the API name 23 | 24 | (def auth (gapi.auth/create-auth "YOUR_API_KEY")) 25 | (api-ns auth "https://www.googleapis.com/discovery/v1/apis/plus/v1/rest") 26 | 27 | This will generate an API based on the Google+ service, and will implicitly include the supplied auth example, so you wont need it for future calls. We will now have names such that map to the resources and functions for the activities. For example gapi.plus.activites/search. 28 | 29 | (def results (gapi.plus.activities/search {"query" "clojure"})) 30 | (pprint (map #(str (%1 :url) "-" (%1 :title)) (results :items))) 31 | 32 | Each generated function has accompanying documentation metadata which can be accessed with the standard doc command. 33 | 34 | Other Usage 35 | ------------------------- 36 | 37 | To list the available APIs and version, you can query the discovery document: 38 | 39 | (pprint (list-apis)) 40 | 41 | For simple API access, we need to pass in our API key to the auth class. This requires a key generated from a project in the Google developers API console at https://developers.google.com/console. Create a project and go to "API Access" on the left and look for the Simple API Access API key 42 | 43 | (def auth (gapi.auth/create-auth "YOUR_API_KEY")) 44 | 45 | To retrieve the calls for an API, you pass in the API string. In this case, the Google+ public data API. 46 | 47 | (def service (build "https://www.googleapis.com/discovery/v1/apis/plus/v1/rest")) 48 | 49 | Too see which methods are available: 50 | 51 | (list-methods service) 52 | (print (get-doc service "plus.people/listByActivity")) 53 | (get-scopes service "plus.people/listByActivity") 54 | 55 | To call a function, we need to pass in the auth and the params. 56 | 57 | (def results (call auth service "plus.activities/search" {"query" "clojure"})) 58 | (map #(str (%1 :url) "-" (%1 :title)) (results :items)) 59 | 60 | To use OAuth2, we need to generate a ClientID and ClientSecret, and set a redirect URL. We can create a new "web application" client in the Google developers console 61 | 62 | (def auth (gapi.auth/create-auth "YOUR_CLIENT_ID" 63 | "YOUR_CLIENT_SECRET" "http://YOUR_REDIRECT_URL")) 64 | 65 | We then need to generate a token URL to authenticate against. The user will be redirected back to the redirect_url, which GET parameters for code and state, which we can use to exchange a token. We'll need to define any scopes we need to authenticate. Here we'll use the scopes for creating an activity in Google+ history: 66 | 67 | (def scopes ["https://www.googleapis.com/auth/plus.me" "https://www.googleapis.com/auth/urlshortener"]) 68 | (gapi.auth/generate-auth-url auth scopes) 69 | (gapi.auth/exchange-token auth "CODE" "STATE") 70 | 71 | To make a call, we can then use the service as before 72 | 73 | (def me (call auth service "plus.people/get" {"userId" "me"})) 74 | (pprint (me :displayName)) 75 | 76 | We can write as well. For example, here we can use the URL shortener API (which you'll need to enable in the developer API console!) to create a short URL to clojure.org: 77 | 78 | (def service (build "https://www.googleapis.com/discovery/v1/apis/urlshortener/v1/rest")) 79 | (def result (call auth service "urlshortener.url/insert" {} {"longUrl" "http://clojure.org"})) 80 | (pprint result) 81 | 82 | License 83 | ------------------------- 84 | 85 | Copyright (C) 2012 Google 86 | 87 | Distributed under the Apache 2.0 license 88 | -------------------------------------------------------------------------------- /src/gapi/auth.clj: -------------------------------------------------------------------------------- 1 | (ns gapi.auth 2 | (:import 3 | [java.net URLEncoder]) 4 | (:require 5 | [clojure.data.json :as json] 6 | [clj-http.client :as http] 7 | [clojure.string :as string])) 8 | 9 | (declare generate-state encode) 10 | (def ^{:private true} auth_url "https://accounts.google.com/o/oauth2/auth") 11 | (def ^{:private true} token_url "https://accounts.google.com/o/oauth2/token") 12 | 13 | (defn create-auth 14 | "Return a state map used to manage the authentication session. 15 | Can accept either an API key for simple API access or a client 16 | ID, client secret and redirect URL for OAuth2. See 17 | https://developers.google.com/console to generate keys." 18 | ([api_key] 19 | (atom {:api_key api_key})) 20 | ([client_id, client_secret, redirect_url] 21 | (atom {:client_id client_id, :client_secret client_secret, :redirect_url redirect_url}))) 22 | 23 | (defmulti call-params 24 | "Update the call parameters with the authentication details" 25 | (fn [state params] (if (nil? state) 26 | :none 27 | (if (string? (@state :token)) 28 | :oauth :simple)))) 29 | 30 | (defmethod call-params :oauth [state params] 31 | ;; TODO: check for expired auth token and call refresh if possible 32 | (let [headers (if (params :headers) (params :headers) {})] 33 | (assoc params :headers (assoc headers "Authorization" (str "Bearer " (@state :token)))))) 34 | 35 | (defmethod call-params :simple [state, params] 36 | (assoc params :query-params (assoc (params :query-params) "key" (@state :api_key)))) 37 | 38 | (defmethod call-params :default [state, params] 39 | params) 40 | 41 | (defn is-valid 42 | "Returns true if the authentication is valid, and in date." 43 | [state] 44 | (if (@state :token) 45 | (< (System/currentTimeMillis) (@state :expires)) 46 | false)) 47 | 48 | (defn generate-auth-url 49 | "Retrieve a URL suitable for redirecting the user to for auth permissions. 50 | Scopes should be supplied as a vector of required scopes. An optional third 51 | param is a map with access_type and approval_prompt keys." 52 | ([state scopes] (generate-auth-url state scopes {:access_type "offline" :approval_prompt "auto"})) 53 | ([state scopes opts] 54 | (let [ 55 | oauth2-state (generate-state) 56 | params [ 57 | (encode "client_id" (@state :client_id)) 58 | (encode "redirect_uri" (@state :redirect_url)) 59 | (encode "scope" (string/join " " scopes)) 60 | (encode "state" oauth2-state) 61 | "response_type=code" 62 | (encode "access_type" (opts :access_type)) 63 | (encode "approval_prompt" (opts :approval_prompt)) 64 | ]] 65 | (swap! state assoc :state oauth2-state) 66 | (str auth_url "?" (string/join "&" params))))) 67 | 68 | (defn exchange-token 69 | "Handle the user response from the oauth flow and retrieve a valid 70 | auth token. Returns true on success, false on failure." 71 | [state, code, checkstate] 72 | (if (= (@state :state) checkstate) 73 | (let [params [ 74 | (encode "code" code) 75 | (encode "client_id" (@state :client_id)) 76 | (encode "redirect_uri" (@state :redirect_url)) 77 | (encode "client_secret" (@state :client_secret)) 78 | "grant_type=authorization_code" 79 | ] 80 | http_resp (http/post token_url {:body (string/join "&" params) 81 | :content-type "application/x-www-form-urlencoded"}) 82 | resp (json/read-json (http_resp :body))] 83 | (swap! state assoc :token (resp :access_token) 84 | :refresh (resp :refresh_token) 85 | :expires (+ (System/currentTimeMillis) (* (resp :expires_in) 1000))) 86 | true 87 | ) 88 | false)) 89 | 90 | (defn refresh-token 91 | "Generate a new authentication token using the refresh token" 92 | [state] 93 | (if (@state :refresh) 94 | (let [params [ 95 | (encode "client_id" (@state :client_id)) 96 | (encode "client_secret" (@state :client_secret)) 97 | (encode "refresh_token" (@state :refresh)) 98 | "grant_type=refresh_token" 99 | ] 100 | http_resp (http/post token_url {:body (string/join "&" params) 101 | :content-type "application/x-www-form-urlencoded"}) 102 | resp (json/read-json (http_resp :body))] 103 | (swap! state assoc :token (resp :access_token) 104 | :expires (+ (System/currentTimeMillis) (* (resp :expires_in) 1000))) 105 | true) 106 | false)) 107 | 108 | (defn- encode 109 | "Combine the key and value with an = and URL encode each part" 110 | [key val] 111 | (str (URLEncoder/encode (str key) "UTF-8") "=" (URLEncoder/encode (str val) "UTF-8"))) 112 | 113 | (defn- generate-state 114 | "Generate a random string for the state" 115 | [] 116 | (let [buff (make-array Byte/TYPE 10)] 117 | (-> (java.security.SecureRandom.) 118 | (.nextBytes buff)) 119 | (-> (org.apache.commons.codec.binary.Base64.) 120 | (.encode buff) 121 | (String.)))) -------------------------------------------------------------------------------- /src/gapi/core.clj: -------------------------------------------------------------------------------- 1 | (ns gapi.core 2 | (:require 3 | [clojure.data.json :as json] 4 | [clj-http.client :as http] 5 | [clojure.string :as string] 6 | [gapi.auth :as auth])) 7 | 8 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 9 | ;;;;;;;;;;;;;; SETUP ;;;;;;;;;;;;;; 10 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 11 | 12 | ;; Forward Declarations 13 | (declare extract-methods) 14 | (declare build-ns) 15 | 16 | ;; The base Discovery Service URL we will process 17 | (def ^{:private true} discovery_url "https://www.googleapis.com/discovery/v1/apis") 18 | (def ^{:private true} cache (atom {})) 19 | 20 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 21 | ;;;;;;;;;;;;;; API ;;;;;;;;;;;;;; 22 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 23 | 24 | (defn list-apis 25 | "Directly eturn a list of APIs available to built, and endpoint discovery document URLs." 26 | [] 27 | (let [discovery-doc (json/read-json ((http/get discovery_url) :body))] 28 | (map #(vector (%1 :name) (%1 :version) (%1 :discoveryRestUrl)) 29 | (filter #(= (%1 :preferred) true) (discovery-doc :items))))) 30 | 31 | (defn build-resource [base r] 32 | (reduce 33 | (fn [methods [key resource]] 34 | (merge methods 35 | (extract-methods base resource) 36 | (build-resource base resource))) 37 | {} 38 | (:resources r))) 39 | 40 | (defn build 41 | "Given a discovery document URL, construct an map of names to functions that 42 | will make the various calls against the resources. Each call accepts a gapi.auth 43 | state map, and list of argument values, an in some cases a JSON encoded body to send 44 | (for write calls)" 45 | [api_url] 46 | (let [r (json/read-json ((http/get api_url) :body))] 47 | (build-resource (:baseUrl r) r))) 48 | 49 | (defn list-methods 50 | "List the available methods in a service" 51 | [service] 52 | (keys service)) 53 | 54 | (defn get-doc 55 | "Retrieve a docstring for the service call" 56 | [service method] 57 | ((service method) :doc)) 58 | 59 | (defn get-scopes 60 | "Retrieve a vector of scopes for the service" 61 | [service method] 62 | ((service method) :scopes)) 63 | 64 | (defn call 65 | "Call a service function" 66 | [auth service method & args] 67 | (apply ((service method) :fn) auth args)) 68 | 69 | ;; Memoized versions of API calls 70 | (def ^{:private true} m-list-apis (memoize list-apis)) 71 | (def ^{:private true} m-build (memoize build)) 72 | 73 | (defn im 74 | "Call a service, constructing if necessary" 75 | ([auth method_name & args] 76 | (let [ 77 | service_name (first (clojure.string/split method_name #"[\.\/]")) 78 | api (last (filter #(= (first %1) service_name) (m-list-apis))) 79 | service (m-build (last api))] 80 | (apply call auth service method_name args)))) 81 | 82 | (defn anon-im 83 | "Call to a service without authentication" 84 | [method_name & args] 85 | (apply im nil method_name args)) 86 | 87 | (defn api-ns 88 | "Create a namespace for the API calls. TODO: details" 89 | ([api_url] 90 | (api-ns nil api_url)) 91 | ([auth api_url] 92 | (let [ service (m-build api_url) 93 | build-fn (partial build-ns auth)] 94 | (map build-fn service)))) 95 | 96 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 97 | ;;;;;;;; HELPER METHODS ;;;;;;;;;;; 98 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 99 | 100 | (defn- build-ns 101 | "Create an entry in a namespace for the method" 102 | [auth [mname method]] 103 | (let [ name (str "gapi." mname) 104 | parts (clojure.string/split name #"[\.\/]") 105 | namespace (symbol (clojure.string/join "." (pop parts)))] 106 | (if (= nil (find-ns namespace)) (create-ns namespace)) 107 | (intern namespace 108 | (with-meta (symbol (last parts)) {:doc (method :doc) :arglists (method :arglists)}) 109 | (partial (method :fn) auth)) 110 | name)) 111 | 112 | (defn- get-method-name 113 | "Get a friendly namespace-esque string for the method" 114 | [name] 115 | (let [parts (clojure.string/split name #"\.")] 116 | (str (clojure.string/join "." (pop parts)) "/" (last parts)))) 117 | 118 | (defn- match-params 119 | "Filter the parameters by a given function" 120 | [params func] 121 | (let [required (filter (fn [[k v]] (func v)) params)] 122 | (map (fn [[k v]] (name k)) required))) 123 | 124 | (defn- get-path-params 125 | "Return a vector of parameter names which appear in the URL path" 126 | [params] 127 | (match-params params (fn [p] (= "path" (p :location))))) 128 | 129 | (defn- get-required-params 130 | "Return a vector of required parameter names" 131 | [params] 132 | (match-params params (fn [p] (p :required)))) 133 | 134 | (defn- hasreqs? 135 | "Determine whether the required params are present in the arguments" 136 | [params args] 137 | (reduce #(and %1 %2) true (map #(contains? args %1) (get-required-params params)))) 138 | 139 | (defn- get-response 140 | "Check an HTTP response, JSON decoding the body if valud" 141 | [res] 142 | (if (= (res :status) 200) 143 | (json/read-json (res :body)) 144 | (let [body (json/read-json (res :body))] 145 | {:error ((body :error) :message)}))) 146 | 147 | (defn- get-url 148 | "Replace URL path parameters with their values" 149 | [base_url path params args] 150 | (str base_url 151 | (reduce #(string/replace %1 (str "{" %2 "}") (args %2)) path params))) 152 | 153 | (defmulti #^{:private true} callfn 154 | "Retrieve an anonymous function that makes the proper call for the 155 | supplied method description." 156 | (fn [base_url method] (method :httpMethod))) 157 | 158 | (defmethod callfn "GET" [base_url {path :path method_params :parameters}] 159 | (fn ([state args] 160 | {:pre [(hasreqs? method_params args)]} 161 | (get-response (http/get (get-url base_url path (get-path-params method_params) args) 162 | (auth/call-params state {:throw-exceptions false :query-params args})))))) 163 | 164 | (defmethod callfn "POST" [base_url {path :path method_params :parameters}] 165 | (fn ([state args body] 166 | {:pre [(hasreqs? method_params args)]} 167 | (get-response (http/post (get-url base_url path (get-path-params method_params) args) 168 | (auth/call-params state {:throw-exceptions false :body (json/json-str body) :content-type :json :query-params args})))))) 169 | 170 | (defmethod callfn "DELETE" [base_url {path :path method_params :parameters}] 171 | (fn ([state args body] 172 | {:pre [(hasreqs? method_params args)]} 173 | (get-response (http/delete (get-url base_url path (get-path-params method_params) args) 174 | (auth/call-params state {:throw-exceptions false :body (json/json-str body) :content-type :json :query-params args})))))) 175 | 176 | (defmethod callfn "PUT" [base_url {path :path method_params :parameters}] 177 | (fn ([state args body] 178 | {:pre [(hasreqs? method_params args)]} 179 | (get-response (http/put (get-url base_url path (get-path-params method_params) args) 180 | (auth/call-params state {:throw-exceptions false :body (json/json-str body) :content-type :json :query-params args})))))) 181 | 182 | (defn- docstring 183 | "Return a description for this method" 184 | [method] 185 | (str (method :description) "\n" 186 | "Required parameters: " (string/join " "(get-required-params (method :parameters))) 187 | "\n")) 188 | 189 | (defn- arglists 190 | "Return an argument list for the method" 191 | [method] 192 | (let [base_args 193 | (if (= (method :description) "POST") '[auth parameters body] '[auth parameters])] 194 | base_args)) 195 | 196 | (defn- extract-methods 197 | "Retrieve all methods from the given resource" 198 | [base_url resource] 199 | (reduce 200 | (fn [methods [key method]] 201 | (assoc methods 202 | (get-method-name (method :id)) 203 | {:fn (callfn base_url method) 204 | :doc (docstring method) 205 | :arglists (arglists method) 206 | :scopes (method :scopes)})) 207 | {} (resource :methods))) 208 | -------------------------------------------------------------------------------- /data/apis.json: -------------------------------------------------------------------------------- 1 | { 2 | "kind": "discovery#directoryList", 3 | "discoveryVersion": "v1", 4 | "items": [ 5 | { 6 | "kind": "discovery#directoryItem", 7 | "id": "adexchangebuyer:v1", 8 | "name": "adexchangebuyer", 9 | "version": "v1", 10 | "title": "Ad Exchange Buyer API", 11 | "description": "Lets you manage your Ad Exchange Buyer account.", 12 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adexchangebuyer/v1/rest", 13 | "discoveryLink": "./apis/adexchangebuyer/v1/rest", 14 | "icons": { 15 | "x16": "http://www.google.com/images/icons/product/doubleclick-16.gif", 16 | "x32": "http://www.google.com/images/icons/product/doubleclick-32.gif" 17 | }, 18 | "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest", 19 | "preferred": false 20 | }, 21 | { 22 | "kind": "discovery#directoryItem", 23 | "id": "adexchangebuyer:v1.1", 24 | "name": "adexchangebuyer", 25 | "version": "v1.1", 26 | "title": "Ad Exchange Buyer API", 27 | "description": "Lets you manage your Ad Exchange Buyer account.", 28 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adexchangebuyer/v1.1/rest", 29 | "discoveryLink": "./apis/adexchangebuyer/v1.1/rest", 30 | "icons": { 31 | "x16": "http://www.google.com/images/icons/product/doubleclick-16.gif", 32 | "x32": "http://www.google.com/images/icons/product/doubleclick-32.gif" 33 | }, 34 | "documentationLink": "https://developers.google.com/ad-exchange/buyer-rest", 35 | "preferred": true 36 | }, 37 | { 38 | "kind": "discovery#directoryItem", 39 | "id": "adexchangeseller:v1", 40 | "name": "adexchangeseller", 41 | "version": "v1", 42 | "title": "Ad Exchange Seller API", 43 | "description": "Gives Ad Exchange seller users access to their inventory and the ability to generate reports", 44 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adexchangeseller/v1/rest", 45 | "discoveryLink": "./apis/adexchangeseller/v1/rest", 46 | "icons": { 47 | "x16": "http://www.google.com/images/icons/product/doubleclick-16.gif", 48 | "x32": "http://www.google.com/images/icons/product/doubleclick-32.gif" 49 | }, 50 | "documentationLink": "https://developers.google.com/adsense/management/", 51 | "preferred": true 52 | }, 53 | { 54 | "kind": "discovery#directoryItem", 55 | "id": "adsense:v1", 56 | "name": "adsense", 57 | "version": "v1", 58 | "title": "AdSense Management API", 59 | "description": "Gives AdSense publishers access to their inventory and the ability to generate reports", 60 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adsense/v1/rest", 61 | "discoveryLink": "./apis/adsense/v1/rest", 62 | "icons": { 63 | "x16": "http://www.google.com/images/icons/product/adsense-16.png", 64 | "x32": "http://www.google.com/images/icons/product/adsense-32.png" 65 | }, 66 | "documentationLink": "https://developers.google.com/adsense/management/", 67 | "preferred": false 68 | }, 69 | { 70 | "kind": "discovery#directoryItem", 71 | "id": "adsense:v1.1", 72 | "name": "adsense", 73 | "version": "v1.1", 74 | "title": "AdSense Management API", 75 | "description": "Gives AdSense publishers access to their inventory and the ability to generate reports", 76 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adsense/v1.1/rest", 77 | "discoveryLink": "./apis/adsense/v1.1/rest", 78 | "icons": { 79 | "x16": "http://www.google.com/images/icons/product/adsense-16.png", 80 | "x32": "http://www.google.com/images/icons/product/adsense-32.png" 81 | }, 82 | "documentationLink": "https://developers.google.com/adsense/management/", 83 | "preferred": false 84 | }, 85 | { 86 | "kind": "discovery#directoryItem", 87 | "id": "adsense:v1.2", 88 | "name": "adsense", 89 | "version": "v1.2", 90 | "title": "AdSense Management API", 91 | "description": "Gives AdSense publishers access to their inventory and the ability to generate reports", 92 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adsense/v1.2/rest", 93 | "discoveryLink": "./apis/adsense/v1.2/rest", 94 | "icons": { 95 | "x16": "http://www.google.com/images/icons/product/adsense-16.png", 96 | "x32": "http://www.google.com/images/icons/product/adsense-32.png" 97 | }, 98 | "documentationLink": "https://developers.google.com/adsense/management/", 99 | "preferred": true 100 | }, 101 | { 102 | "kind": "discovery#directoryItem", 103 | "id": "adsensehost:v4.1", 104 | "name": "adsensehost", 105 | "version": "v4.1", 106 | "title": "AdSense Host API", 107 | "description": "Gives AdSense Hosts access to report generation, ad code generation, and publisher management capabilities.", 108 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/adsensehost/v4.1/rest", 109 | "discoveryLink": "./apis/adsensehost/v4.1/rest", 110 | "icons": { 111 | "x16": "http://www.google.com/images/icons/product/adsense-16.png", 112 | "x32": "http://www.google.com/images/icons/product/adsense-32.png" 113 | }, 114 | "documentationLink": "https://developers.google.com/adsense/host/", 115 | "preferred": true 116 | }, 117 | { 118 | "kind": "discovery#directoryItem", 119 | "id": "analytics:v2.4preprod", 120 | "name": "analytics", 121 | "version": "v2.4preprod", 122 | "title": "Google Analytics API", 123 | "description": "View and manage your Google Analytics data", 124 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/analytics/v2.4preprod/rest", 125 | "discoveryLink": "./apis/analytics/v2.4preprod/rest", 126 | "icons": { 127 | "x16": "http://www.google.com/images/icons/product/analytics-16.png", 128 | "x32": "http://www.google.com/images/icons/product/analytics-32.png" 129 | }, 130 | "documentationLink": "https://developers.google.com/analytics/", 131 | "preferred": false 132 | }, 133 | { 134 | "kind": "discovery#directoryItem", 135 | "id": "analytics:v3alphapreprod", 136 | "name": "analytics", 137 | "version": "v3alphapreprod", 138 | "title": "Google Analytics API - Alpha Version", 139 | "description": "View and manage your Google Analytics data", 140 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/analytics/v3alphapreprod/rest", 141 | "discoveryLink": "./apis/analytics/v3alphapreprod/rest", 142 | "icons": { 143 | "x16": "http://www.google.com/images/icons/product/analytics-16.png", 144 | "x32": "http://www.google.com/images/icons/product/analytics-32.png" 145 | }, 146 | "documentationLink": "https://developers.google.com/analytics/", 147 | "preferred": false 148 | }, 149 | { 150 | "kind": "discovery#directoryItem", 151 | "id": "analytics:v3internalpreprod", 152 | "name": "analytics", 153 | "version": "v3internalpreprod", 154 | "title": "Google Analytics API", 155 | "description": "View and manage your Google Analytics data", 156 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/analytics/v3internalpreprod/rest", 157 | "discoveryLink": "./apis/analytics/v3internalpreprod/rest", 158 | "icons": { 159 | "x16": "http://www.google.com/images/icons/product/analytics-16.png", 160 | "x32": "http://www.google.com/images/icons/product/analytics-32.png" 161 | }, 162 | "documentationLink": "https://developers.google.com/analytics/", 163 | "preferred": false 164 | }, 165 | { 166 | "kind": "discovery#directoryItem", 167 | "id": "analytics:v3preprod", 168 | "name": "analytics", 169 | "version": "v3preprod", 170 | "title": "Google Analytics API", 171 | "description": "View and manage your Google Analytics data", 172 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/analytics/v3preprod/rest", 173 | "discoveryLink": "./apis/analytics/v3preprod/rest", 174 | "icons": { 175 | "x16": "http://www.google.com/images/icons/product/analytics-16.png", 176 | "x32": "http://www.google.com/images/icons/product/analytics-32.png" 177 | }, 178 | "documentationLink": "https://developers.google.com/analytics/", 179 | "preferred": false 180 | }, 181 | { 182 | "kind": "discovery#directoryItem", 183 | "id": "analytics:v2.4", 184 | "name": "analytics", 185 | "version": "v2.4", 186 | "title": "Google Analytics API", 187 | "description": "View and manage your Google Analytics data", 188 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/analytics/v2.4/rest", 189 | "discoveryLink": "./apis/analytics/v2.4/rest", 190 | "icons": { 191 | "x16": "http://www.google.com/images/icons/product/analytics-16.png", 192 | "x32": "http://www.google.com/images/icons/product/analytics-32.png" 193 | }, 194 | "documentationLink": "https://developers.google.com/analytics/", 195 | "preferred": false 196 | }, 197 | { 198 | "kind": "discovery#directoryItem", 199 | "id": "analytics:v3", 200 | "name": "analytics", 201 | "version": "v3", 202 | "title": "Google Analytics API", 203 | "description": "View and manage your Google Analytics data", 204 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/analytics/v3/rest", 205 | "discoveryLink": "./apis/analytics/v3/rest", 206 | "icons": { 207 | "x16": "http://www.google.com/images/icons/product/analytics-16.png", 208 | "x32": "http://www.google.com/images/icons/product/analytics-32.png" 209 | }, 210 | "documentationLink": "https://developers.google.com/analytics/", 211 | "preferred": true 212 | }, 213 | { 214 | "kind": "discovery#directoryItem", 215 | "id": "androidpublisher:v1", 216 | "name": "androidpublisher", 217 | "version": "v1", 218 | "title": "Google Play Android Developer API", 219 | "description": "Lets Android application developers access their Google Play accounts.", 220 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/androidpublisher/v1/rest", 221 | "discoveryLink": "./apis/androidpublisher/v1/rest", 222 | "icons": { 223 | "x16": "http://www.google.com/images/icons/product/android-16.png", 224 | "x32": "http://www.google.com/images/icons/product/android-32.png" 225 | }, 226 | "documentationLink": "https://developers.google.com/android-publisher", 227 | "preferred": true 228 | }, 229 | { 230 | "kind": "discovery#directoryItem", 231 | "id": "audit:v1", 232 | "name": "audit", 233 | "version": "v1", 234 | "title": "Enterprise Audit API", 235 | "description": "Lets you access user activities in your enterprise made through various applications.", 236 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/audit/v1/rest", 237 | "discoveryLink": "./apis/audit/v1/rest", 238 | "icons": { 239 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 240 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 241 | }, 242 | "documentationLink": "http://code.google.com/googleapps/domain/audit_admin/v1/getting_started.html", 243 | "preferred": true 244 | }, 245 | { 246 | "kind": "discovery#directoryItem", 247 | "id": "bigquery:v2", 248 | "name": "bigquery", 249 | "version": "v2", 250 | "title": "BigQuery API", 251 | "description": "A data platform for customers to create, manage, share and query data.", 252 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/bigquery/v2/rest", 253 | "discoveryLink": "./apis/bigquery/v2/rest", 254 | "icons": { 255 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 256 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 257 | }, 258 | "documentationLink": "https://developers.google.com/bigquery/docs/overview", 259 | "preferred": true 260 | }, 261 | { 262 | "kind": "discovery#directoryItem", 263 | "id": "blogger:v2", 264 | "name": "blogger", 265 | "version": "v2", 266 | "title": "Blogger API", 267 | "description": "API for access to the data within Blogger.", 268 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/blogger/v2/rest", 269 | "discoveryLink": "./apis/blogger/v2/rest", 270 | "icons": { 271 | "x16": "http://www.google.com/images/icons/product/blogger-16.png", 272 | "x32": "http://www.google.com/images/icons/product/blogger-32.png" 273 | }, 274 | "documentationLink": "https://developers.google.com/blogger/docs/2.0/json/getting_started", 275 | "labels": [ 276 | "limited_availability" 277 | ], 278 | "preferred": false 279 | }, 280 | { 281 | "kind": "discovery#directoryItem", 282 | "id": "blogger:v3", 283 | "name": "blogger", 284 | "version": "v3", 285 | "title": "Blogger API", 286 | "description": "API for access to the data within Blogger.", 287 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/blogger/v3/rest", 288 | "discoveryLink": "./apis/blogger/v3/rest", 289 | "icons": { 290 | "x16": "http://www.google.com/images/icons/product/blogger-16.png", 291 | "x32": "http://www.google.com/images/icons/product/blogger-32.png" 292 | }, 293 | "documentationLink": "https://developers.google.com/blogger/docs/3.0/getting_started", 294 | "labels": [ 295 | "limited_availability" 296 | ], 297 | "preferred": true 298 | }, 299 | { 300 | "kind": "discovery#directoryItem", 301 | "id": "books:v1", 302 | "name": "books", 303 | "version": "v1", 304 | "title": "Books API", 305 | "description": "Lets you search for books and manage your Google Books library.", 306 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/books/v1/rest", 307 | "discoveryLink": "./apis/books/v1/rest", 308 | "icons": { 309 | "x16": "http://www.google.com/images/icons/product/ebooks-16.png", 310 | "x32": "http://www.google.com/images/icons/product/ebooks-32.png" 311 | }, 312 | "documentationLink": "https://developers.google.com/books/docs/v1/getting_started", 313 | "preferred": true 314 | }, 315 | { 316 | "kind": "discovery#directoryItem", 317 | "id": "calendar:v3", 318 | "name": "calendar", 319 | "version": "v3", 320 | "title": "Calendar API", 321 | "description": "Lets you manipulate events and other calendar data.", 322 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest", 323 | "discoveryLink": "./apis/calendar/v3/rest", 324 | "icons": { 325 | "x16": "http://www.google.com/images/icons/product/calendar-16.png", 326 | "x32": "http://www.google.com/images/icons/product/calendar-32.png" 327 | }, 328 | "documentationLink": "https://developers.google.com/google-apps/calendar/firstapp", 329 | "preferred": true 330 | }, 331 | { 332 | "kind": "discovery#directoryItem", 333 | "id": "civicinfo:us_v1", 334 | "name": "civicinfo", 335 | "version": "us_v1", 336 | "title": "Google Civic Information API", 337 | "description": "An API for accessing civic information.", 338 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/civicinfo/us_v1/rest", 339 | "discoveryLink": "./apis/civicinfo/us_v1/rest", 340 | "icons": { 341 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 342 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 343 | }, 344 | "documentationLink": "https://developers.google.com/civic-information", 345 | "preferred": true 346 | }, 347 | { 348 | "kind": "discovery#directoryItem", 349 | "id": "compute:v1beta12", 350 | "name": "compute", 351 | "version": "v1beta12", 352 | "title": "Compute Engine API", 353 | "description": "API for the Google Compute Engine service.", 354 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/compute/v1beta12/rest", 355 | "discoveryLink": "./apis/compute/v1beta12/rest", 356 | "icons": { 357 | "x16": "http://www.google.com/images/icons/product/compute_engine-16.png", 358 | "x32": "http://www.google.com/images/icons/product/compute_engine-32.png" 359 | }, 360 | "documentationLink": "https://developers.google.com/compute/docs/reference/v1beta12", 361 | "labels": [ 362 | "limited_availability" 363 | ], 364 | "preferred": true 365 | }, 366 | { 367 | "kind": "discovery#directoryItem", 368 | "id": "coordinate:v1", 369 | "name": "coordinate", 370 | "version": "v1", 371 | "title": "Google Maps Coordinate API", 372 | "description": "Lets you view and manage jobs in a Coordinate team.", 373 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/coordinate/v1/rest", 374 | "discoveryLink": "./apis/coordinate/v1/rest", 375 | "icons": { 376 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 377 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 378 | }, 379 | "documentationLink": "https://developers.google.com/coordinate/", 380 | "preferred": true 381 | }, 382 | { 383 | "kind": "discovery#directoryItem", 384 | "id": "customsearch:v1", 385 | "name": "customsearch", 386 | "version": "v1", 387 | "title": "CustomSearch API", 388 | "description": "Lets you search over a website or collection of websites", 389 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/customsearch/v1/rest", 390 | "discoveryLink": "./apis/customsearch/v1/rest", 391 | "icons": { 392 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 393 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 394 | }, 395 | "documentationLink": "https://developers.google.com/custom-search/v1/using_rest", 396 | "preferred": true 397 | }, 398 | { 399 | "kind": "discovery#directoryItem", 400 | "id": "dfareporting:v1", 401 | "name": "dfareporting", 402 | "version": "v1", 403 | "title": "DFA Reporting API", 404 | "description": "Lets you create, run and download reports.", 405 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/dfareporting/v1/rest", 406 | "discoveryLink": "./apis/dfareporting/v1/rest", 407 | "icons": { 408 | "x16": "http://www.google.com/images/icons/product/doubleclick-16.gif", 409 | "x32": "http://www.google.com/images/icons/product/doubleclick-32.gif" 410 | }, 411 | "documentationLink": "https://developers.google.com/doubleclick-advertisers/reporting/", 412 | "preferred": false 413 | }, 414 | { 415 | "kind": "discovery#directoryItem", 416 | "id": "dfareporting:v1.1", 417 | "name": "dfareporting", 418 | "version": "v1.1", 419 | "title": "DFA Reporting API", 420 | "description": "Lets you create, run and download reports.", 421 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/dfareporting/v1.1/rest", 422 | "discoveryLink": "./apis/dfareporting/v1.1/rest", 423 | "icons": { 424 | "x16": "http://www.google.com/images/icons/product/doubleclick-16.gif", 425 | "x32": "http://www.google.com/images/icons/product/doubleclick-32.gif" 426 | }, 427 | "documentationLink": "https://developers.google.com/doubleclick-advertisers/reporting/", 428 | "preferred": true 429 | }, 430 | { 431 | "kind": "discovery#directoryItem", 432 | "id": "discovery:v1", 433 | "name": "discovery", 434 | "version": "v1", 435 | "title": "APIs Discovery Service", 436 | "description": "Lets you discover information about other Google APIs, such as what APIs are available, the resource and method details for each API", 437 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/discovery/v1/rest", 438 | "discoveryLink": "./apis/discovery/v1/rest", 439 | "icons": { 440 | "x16": "http://www.google.com/images/icons/feature/filing_cabinet_search-g16.png", 441 | "x32": "http://www.google.com/images/icons/feature/filing_cabinet_search-g32.png" 442 | }, 443 | "documentationLink": "https://developers.google.com/discovery/", 444 | "preferred": true 445 | }, 446 | { 447 | "kind": "discovery#directoryItem", 448 | "id": "drive:v2.1beta", 449 | "name": "drive", 450 | "version": "v2.1beta", 451 | "title": "Drive API", 452 | "description": "The API to interact with Drive.", 453 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/drive/v2.1beta/rest", 454 | "discoveryLink": "./apis/drive/v2.1beta/rest", 455 | "icons": { 456 | "x16": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png", 457 | "x32": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png" 458 | }, 459 | "documentationLink": "https://developers.google.com/drive/", 460 | "preferred": false 461 | }, 462 | { 463 | "kind": "discovery#directoryItem", 464 | "id": "drive:v1", 465 | "name": "drive", 466 | "version": "v1", 467 | "title": "Drive API", 468 | "description": "The API to interact with Drive.", 469 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/drive/v1/rest", 470 | "discoveryLink": "./apis/drive/v1/rest", 471 | "icons": { 472 | "x16": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png", 473 | "x32": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png" 474 | }, 475 | "documentationLink": "https://developers.google.com/drive/", 476 | "preferred": false 477 | }, 478 | { 479 | "kind": "discovery#directoryItem", 480 | "id": "drive:v2", 481 | "name": "drive", 482 | "version": "v2", 483 | "title": "Drive API", 484 | "description": "The API to interact with Drive.", 485 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/drive/v2/rest", 486 | "discoveryLink": "./apis/drive/v2/rest", 487 | "icons": { 488 | "x16": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_16.png", 489 | "x32": "https://ssl.gstatic.com/docs/doclist/images/drive_icon_32.png" 490 | }, 491 | "documentationLink": "https://developers.google.com/drive/", 492 | "preferred": true 493 | }, 494 | { 495 | "kind": "discovery#directoryItem", 496 | "id": "freebase:v1sandbox", 497 | "name": "freebase", 498 | "version": "v1sandbox", 499 | "title": "Freebase API", 500 | "description": "Lets you access the Freebase repository of open data.", 501 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/freebase/v1sandbox/rest", 502 | "discoveryLink": "./apis/freebase/v1sandbox/rest", 503 | "icons": { 504 | "x16": "http://www.google.com/images/icons/product/freebase-16.png", 505 | "x32": "http://www.google.com/images/icons/product/freebase-32.png" 506 | }, 507 | "documentationLink": "http://wiki.freebase.com/wiki/API", 508 | "preferred": false 509 | }, 510 | { 511 | "kind": "discovery#directoryItem", 512 | "id": "freebase:v1", 513 | "name": "freebase", 514 | "version": "v1", 515 | "title": "Freebase API", 516 | "description": "Lets you access the Freebase repository of open data.", 517 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/freebase/v1/rest", 518 | "discoveryLink": "./apis/freebase/v1/rest", 519 | "icons": { 520 | "x16": "http://www.google.com/images/icons/product/freebase-16.png", 521 | "x32": "http://www.google.com/images/icons/product/freebase-32.png" 522 | }, 523 | "documentationLink": "http://wiki.freebase.com/wiki/API", 524 | "preferred": true 525 | }, 526 | { 527 | "kind": "discovery#directoryItem", 528 | "id": "fusiontables:v1", 529 | "name": "fusiontables", 530 | "version": "v1", 531 | "title": "Fusion Tables API", 532 | "description": "API for working with Fusion Tables data.", 533 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/fusiontables/v1/rest", 534 | "discoveryLink": "./apis/fusiontables/v1/rest", 535 | "icons": { 536 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 537 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 538 | }, 539 | "documentationLink": "https://developers.google.com/fusiontables", 540 | "preferred": true 541 | }, 542 | { 543 | "kind": "discovery#directoryItem", 544 | "id": "gan:v1beta1", 545 | "name": "gan", 546 | "version": "v1beta1", 547 | "title": "Google Affiliate Network API", 548 | "description": "Lets you have programmatic access to your Google Affiliate Network data.", 549 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/gan/v1beta1/rest", 550 | "discoveryLink": "./apis/gan/v1beta1/rest", 551 | "icons": { 552 | "x16": "http://www.google.com/images/icons/product/affiliatenetwork-16.png", 553 | "x32": "http://www.google.com/images/icons/product/affiliatenetwork-32.png" 554 | }, 555 | "documentationLink": "https://developers.google.com/affiliate-network/", 556 | "preferred": true 557 | }, 558 | { 559 | "kind": "discovery#directoryItem", 560 | "id": "groupssettings:v1", 561 | "name": "groupssettings", 562 | "version": "v1", 563 | "title": "Groups Settings API", 564 | "description": "Lets you manage permission levels and related settings of a group.", 565 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/groupssettings/v1/rest", 566 | "discoveryLink": "./apis/groupssettings/v1/rest", 567 | "icons": { 568 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 569 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 570 | }, 571 | "documentationLink": "https://developers.google.com/google-apps/groups-settings/get_started", 572 | "labels": [ 573 | "limited_availability" 574 | ], 575 | "preferred": true 576 | }, 577 | { 578 | "kind": "discovery#directoryItem", 579 | "id": "latitude:v1", 580 | "name": "latitude", 581 | "version": "v1", 582 | "title": "Google Latitude API", 583 | "description": "Lets you read and update your current location and work with your location history", 584 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/latitude/v1/rest", 585 | "discoveryLink": "./apis/latitude/v1/rest", 586 | "icons": { 587 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 588 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 589 | }, 590 | "documentationLink": "https://developers.google.com/latitude/v1/using", 591 | "preferred": true 592 | }, 593 | { 594 | "kind": "discovery#directoryItem", 595 | "id": "licensing:v1", 596 | "name": "licensing", 597 | "version": "v1", 598 | "title": "Enterprise License Manager API", 599 | "description": "Licensing API to view and manage license for your domain.", 600 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/licensing/v1/rest", 601 | "discoveryLink": "./apis/licensing/v1/rest", 602 | "icons": { 603 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 604 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 605 | }, 606 | "documentationLink": "https://developers.google.com/google-apps/licensing/", 607 | "preferred": true 608 | }, 609 | { 610 | "kind": "discovery#directoryItem", 611 | "id": "moderator:v1", 612 | "name": "moderator", 613 | "version": "v1", 614 | "title": "Moderator API", 615 | "description": "Moderator API", 616 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/moderator/v1/rest", 617 | "discoveryLink": "./apis/moderator/v1/rest", 618 | "icons": { 619 | "x16": "http://www.google.com/images/icons/product/moderator-32.png", 620 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 621 | }, 622 | "documentationLink": "http://code.google.com/apis/moderator/v1/using_rest.html", 623 | "preferred": true 624 | }, 625 | { 626 | "kind": "discovery#directoryItem", 627 | "id": "oauth2:v1", 628 | "name": "oauth2", 629 | "version": "v1", 630 | "title": "Google OAuth2 API", 631 | "description": "Lets you access OAuth2 protocol related APIs.", 632 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/oauth2/v1/rest", 633 | "discoveryLink": "./apis/oauth2/v1/rest", 634 | "icons": { 635 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 636 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 637 | }, 638 | "documentationLink": "https://developers.google.com/accounts/docs/OAuth2", 639 | "preferred": false 640 | }, 641 | { 642 | "kind": "discovery#directoryItem", 643 | "id": "oauth2:v2", 644 | "name": "oauth2", 645 | "version": "v2", 646 | "title": "Google OAuth2 API", 647 | "description": "Lets you access OAuth2 protocol related APIs.", 648 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/oauth2/v2/rest", 649 | "discoveryLink": "./apis/oauth2/v2/rest", 650 | "icons": { 651 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 652 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 653 | }, 654 | "documentationLink": "https://developers.google.com/accounts/docs/OAuth2", 655 | "preferred": true 656 | }, 657 | { 658 | "kind": "discovery#directoryItem", 659 | "id": "orkut:v2", 660 | "name": "orkut", 661 | "version": "v2", 662 | "title": "Orkut API", 663 | "description": "Lets you manage activities, comments and badges in Orkut. More stuff coming in time.", 664 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/orkut/v2/rest", 665 | "discoveryLink": "./apis/orkut/v2/rest", 666 | "icons": { 667 | "x16": "http://www.google.com/images/icons/product/orkut-16.png", 668 | "x32": "http://www.google.com/images/icons/product/orkut-32.png" 669 | }, 670 | "documentationLink": "http://code.google.com/apis/orkut/v2/reference.html", 671 | "preferred": true 672 | }, 673 | { 674 | "kind": "discovery#directoryItem", 675 | "id": "pagespeedonline:v1", 676 | "name": "pagespeedonline", 677 | "version": "v1", 678 | "title": "Page Speed Online API", 679 | "description": "Lets you analyze the performance of a web page and get tailored suggestions to make that page faster.", 680 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/pagespeedonline/v1/rest", 681 | "discoveryLink": "./apis/pagespeedonline/v1/rest", 682 | "icons": { 683 | "x16": "http://www.google.com/images/icons/product/pagespeed-16.png", 684 | "x32": "http://www.google.com/images/icons/product/pagespeed-32.png" 685 | }, 686 | "documentationLink": "https://developers.google.com/speed/docs/insights/v1/getting_started", 687 | "preferred": true 688 | }, 689 | { 690 | "kind": "discovery#directoryItem", 691 | "id": "plus:v1moments", 692 | "name": "plus", 693 | "version": "v1moments", 694 | "title": "Google+ API", 695 | "description": "The Google+ API enables developers to build on top of the Google+ platform.", 696 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/plus/v1moments/rest", 697 | "discoveryLink": "./apis/plus/v1moments/rest", 698 | "icons": { 699 | "x16": "http://www.google.com/images/icons/product/gplus-16.png", 700 | "x32": "http://www.google.com/images/icons/product/gplus-32.png" 701 | }, 702 | "documentationLink": "https://developers.google.com/+/history/", 703 | "labels": [ 704 | "limited_availability" 705 | ], 706 | "preferred": false 707 | }, 708 | { 709 | "kind": "discovery#directoryItem", 710 | "id": "plus:v1", 711 | "name": "plus", 712 | "version": "v1", 713 | "title": "Google+ API", 714 | "description": "The Google+ API enables developers to build on top of the Google+ platform.", 715 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/plus/v1/rest", 716 | "discoveryLink": "./apis/plus/v1/rest", 717 | "icons": { 718 | "x16": "http://www.google.com/images/icons/product/gplus-16.png", 719 | "x32": "http://www.google.com/images/icons/product/gplus-32.png" 720 | }, 721 | "documentationLink": "https://developers.google.com/+/api/", 722 | "preferred": true 723 | }, 724 | { 725 | "kind": "discovery#directoryItem", 726 | "id": "prediction:v1.2", 727 | "name": "prediction", 728 | "version": "v1.2", 729 | "title": "Prediction API", 730 | "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps", 731 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/prediction/v1.2/rest", 732 | "discoveryLink": "./apis/prediction/v1.2/rest", 733 | "icons": { 734 | "x16": "http://www.google.com/images/icons/feature/predictionapi-16.png", 735 | "x32": "http://www.google.com/images/icons/feature/predictionapi-32.png" 736 | }, 737 | "documentationLink": "https://developers.google.com/prediction/docs/developer-guide", 738 | "preferred": false 739 | }, 740 | { 741 | "kind": "discovery#directoryItem", 742 | "id": "prediction:v1.3", 743 | "name": "prediction", 744 | "version": "v1.3", 745 | "title": "Prediction API", 746 | "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps", 747 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/prediction/v1.3/rest", 748 | "discoveryLink": "./apis/prediction/v1.3/rest", 749 | "icons": { 750 | "x16": "http://www.google.com/images/icons/feature/predictionapi-16.png", 751 | "x32": "http://www.google.com/images/icons/feature/predictionapi-32.png" 752 | }, 753 | "documentationLink": "https://developers.google.com/prediction/docs/developer-guide", 754 | "preferred": false 755 | }, 756 | { 757 | "kind": "discovery#directoryItem", 758 | "id": "prediction:v1.4", 759 | "name": "prediction", 760 | "version": "v1.4", 761 | "title": "Prediction API", 762 | "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps", 763 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/prediction/v1.4/rest", 764 | "discoveryLink": "./apis/prediction/v1.4/rest", 765 | "icons": { 766 | "x16": "http://www.google.com/images/icons/feature/predictionapi-16.png", 767 | "x32": "http://www.google.com/images/icons/feature/predictionapi-32.png" 768 | }, 769 | "documentationLink": "https://developers.google.com/prediction/docs/developer-guide", 770 | "preferred": false 771 | }, 772 | { 773 | "kind": "discovery#directoryItem", 774 | "id": "prediction:v1.5", 775 | "name": "prediction", 776 | "version": "v1.5", 777 | "title": "Prediction API", 778 | "description": "Lets you access a cloud hosted machine learning service that makes it easy to build smart apps", 779 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/prediction/v1.5/rest", 780 | "discoveryLink": "./apis/prediction/v1.5/rest", 781 | "icons": { 782 | "x16": "http://www.google.com/images/icons/feature/predictionapi-16.png", 783 | "x32": "http://www.google.com/images/icons/feature/predictionapi-32.png" 784 | }, 785 | "documentationLink": "https://developers.google.com/prediction/docs/developer-guide", 786 | "preferred": true 787 | }, 788 | { 789 | "kind": "discovery#directoryItem", 790 | "id": "reportcard:v1", 791 | "name": "reportcard", 792 | "version": "v1", 793 | "title": "Dashboard Reporting (Reportcard) API", 794 | "description": "Reportcard is an internal tool for serving non-critical notices to engineers and application developers.", 795 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/reportcard/v1/rest", 796 | "discoveryLink": "./apis/reportcard/v1/rest", 797 | "icons": { 798 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 799 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 800 | }, 801 | "documentationLink": "http://goto.google.com/reportcard", 802 | "preferred": true 803 | }, 804 | { 805 | "kind": "discovery#directoryItem", 806 | "id": "reseller:v1sandbox", 807 | "name": "reseller", 808 | "version": "v1sandbox", 809 | "title": "Enterprise Apps Reseller API", 810 | "description": "Lets you create and manage your customers and their subscriptions.", 811 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/reseller/v1sandbox/rest", 812 | "discoveryLink": "./apis/reseller/v1sandbox/rest", 813 | "icons": { 814 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 815 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 816 | }, 817 | "documentationLink": "https://developers.google.com/google-apps/reseller/", 818 | "labels": [ 819 | "limited_availability" 820 | ], 821 | "preferred": false 822 | }, 823 | { 824 | "kind": "discovery#directoryItem", 825 | "id": "reseller:v1", 826 | "name": "reseller", 827 | "version": "v1", 828 | "title": "Enterprise Apps Reseller API", 829 | "description": "Lets you create and manage your customers and their subscriptions.", 830 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/reseller/v1/rest", 831 | "discoveryLink": "./apis/reseller/v1/rest", 832 | "icons": { 833 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 834 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 835 | }, 836 | "documentationLink": "https://developers.google.com/google-apps/reseller/", 837 | "labels": [ 838 | "limited_availability" 839 | ], 840 | "preferred": true 841 | }, 842 | { 843 | "kind": "discovery#directoryItem", 844 | "id": "shopping:v1", 845 | "name": "shopping", 846 | "version": "v1", 847 | "title": "Search API For Shopping", 848 | "description": "Lets you search over product data.", 849 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/shopping/v1/rest", 850 | "discoveryLink": "./apis/shopping/v1/rest", 851 | "icons": { 852 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 853 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 854 | }, 855 | "documentationLink": "https://developers.google.com/shopping-search/v1/getting_started", 856 | "preferred": true 857 | }, 858 | { 859 | "kind": "discovery#directoryItem", 860 | "id": "siteVerification:v1", 861 | "name": "siteVerification", 862 | "version": "v1", 863 | "title": "Google Site Verification API", 864 | "description": "Lets you programatically verify ownership of websites or domains with Google.", 865 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/siteVerification/v1/rest", 866 | "discoveryLink": "./apis/siteVerification/v1/rest", 867 | "icons": { 868 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 869 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 870 | }, 871 | "documentationLink": "http://code.google.com/apis/siteverification/", 872 | "preferred": true 873 | }, 874 | { 875 | "kind": "discovery#directoryItem", 876 | "id": "storage:v1beta1", 877 | "name": "storage", 878 | "version": "v1beta1", 879 | "title": "Cloud Storage API", 880 | "description": "Lets you store and retrieve potentially-large, immutable data objects.", 881 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/storage/v1beta1/rest", 882 | "discoveryLink": "./apis/storage/v1beta1/rest", 883 | "icons": { 884 | "x16": "https://www.google.com/images/icons/product/cloud_storage-16.png", 885 | "x32": "https://www.google.com/images/icons/product/cloud_storage-32.png" 886 | }, 887 | "documentationLink": "https://developers.google.com/storage/docs/json_api/", 888 | "labels": [ 889 | "limited_availability" 890 | ], 891 | "preferred": true 892 | }, 893 | { 894 | "kind": "discovery#directoryItem", 895 | "id": "taskqueue:v1beta1", 896 | "name": "taskqueue", 897 | "version": "v1beta1", 898 | "title": "TaskQueue API", 899 | "description": "Lets you access a Google App Engine Pull Task Queue over REST.", 900 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/taskqueue/v1beta1/rest", 901 | "discoveryLink": "./apis/taskqueue/v1beta1/rest", 902 | "icons": { 903 | "x16": "http://www.google.com/images/icons/product/app_engine-16.png", 904 | "x32": "http://www.google.com/images/icons/product/app_engine-32.png" 905 | }, 906 | "documentationLink": "http://code.google.com/appengine/docs/python/taskqueue/rest.html", 907 | "preferred": false 908 | }, 909 | { 910 | "kind": "discovery#directoryItem", 911 | "id": "taskqueue:v1beta2", 912 | "name": "taskqueue", 913 | "version": "v1beta2", 914 | "title": "TaskQueue API", 915 | "description": "Lets you access a Google App Engine Pull Task Queue over REST.", 916 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/taskqueue/v1beta2/rest", 917 | "discoveryLink": "./apis/taskqueue/v1beta2/rest", 918 | "icons": { 919 | "x16": "http://www.google.com/images/icons/product/app_engine-16.png", 920 | "x32": "http://www.google.com/images/icons/product/app_engine-32.png" 921 | }, 922 | "documentationLink": "http://code.google.com/appengine/docs/python/taskqueue/rest.html", 923 | "preferred": true 924 | }, 925 | { 926 | "kind": "discovery#directoryItem", 927 | "id": "tasks:v1", 928 | "name": "tasks", 929 | "version": "v1", 930 | "title": "Tasks API", 931 | "description": "Lets you manage your tasks and task lists.", 932 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/tasks/v1/rest", 933 | "discoveryLink": "./apis/tasks/v1/rest", 934 | "icons": { 935 | "x16": "http://www.google.com/images/icons/product/tasks-16.png", 936 | "x32": "http://www.google.com/images/icons/product/tasks-32.png" 937 | }, 938 | "documentationLink": "http://code.google.com/apis/tasks/v1/using.html", 939 | "preferred": true 940 | }, 941 | { 942 | "kind": "discovery#directoryItem", 943 | "id": "translate:v2", 944 | "name": "translate", 945 | "version": "v2", 946 | "title": "Translate API", 947 | "description": "Lets you translate text from one language to another", 948 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/translate/v2/rest", 949 | "discoveryLink": "./apis/translate/v2/rest", 950 | "icons": { 951 | "x16": "http://www.google.com/images/icons/product/translate-16.png", 952 | "x32": "http://www.google.com/images/icons/product/translate-32.png" 953 | }, 954 | "documentationLink": "http://code.google.com/apis/language/translate/v2/using_rest.html", 955 | "preferred": true 956 | }, 957 | { 958 | "kind": "discovery#directoryItem", 959 | "id": "urlshortener:v1", 960 | "name": "urlshortener", 961 | "version": "v1", 962 | "title": "URL Shortener API", 963 | "description": "Lets you create, inspect, and manage goo.gl short URLs", 964 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/urlshortener/v1/rest", 965 | "discoveryLink": "./apis/urlshortener/v1/rest", 966 | "icons": { 967 | "x16": "http://www.google.com/images/icons/product/search-16.gif", 968 | "x32": "http://www.google.com/images/icons/product/search-32.gif" 969 | }, 970 | "documentationLink": "http://code.google.com/apis/urlshortener/v1/getting_started.html", 971 | "preferred": true 972 | }, 973 | { 974 | "kind": "discovery#directoryItem", 975 | "id": "webfonts:v1", 976 | "name": "webfonts", 977 | "version": "v1", 978 | "title": "Google Web Fonts Developer API", 979 | "description": "The Google Web Fonts Developer API.", 980 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/webfonts/v1/rest", 981 | "discoveryLink": "./apis/webfonts/v1/rest", 982 | "icons": { 983 | "x16": "http://www.google.com/images/icons/feature/font_api-16.png", 984 | "x32": "http://www.google.com/images/icons/feature/font_api-32.gif" 985 | }, 986 | "documentationLink": "http://code.google.com/apis/webfonts/docs/developer_api.html", 987 | "preferred": true 988 | }, 989 | { 990 | "kind": "discovery#directoryItem", 991 | "id": "youtube:v3", 992 | "name": "youtube", 993 | "version": "v3", 994 | "title": "YouTube API", 995 | "description": "Programmatic access to YouTube features.", 996 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/youtube/v3/rest", 997 | "discoveryLink": "./apis/youtube/v3/rest", 998 | "icons": { 999 | "x16": "http://www.google.com/images/icons/product/youtube-16.png", 1000 | "x32": "http://www.google.com/images/icons/product/youtube-32.png" 1001 | }, 1002 | "documentationLink": "https://developers.google.com/youtube", 1003 | "preferred": true 1004 | }, 1005 | { 1006 | "kind": "discovery#directoryItem", 1007 | "id": "youtubeAnalytics:v1", 1008 | "name": "youtubeAnalytics", 1009 | "version": "v1", 1010 | "title": "YouTube Analytics API", 1011 | "description": "Retrieve your YouTube Analytics reports.", 1012 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/youtubeAnalytics/v1/rest", 1013 | "discoveryLink": "./apis/youtubeAnalytics/v1/rest", 1014 | "icons": { 1015 | "x16": "http://www.google.com/images/icons/product/youtube-16.png", 1016 | "x32": "http://www.google.com/images/icons/product/youtube-32.png" 1017 | }, 1018 | "documentationLink": "http://developers.google.com/youtube/analytics/", 1019 | "labels": [ 1020 | "graduated" 1021 | ], 1022 | "preferred": true 1023 | }, 1024 | { 1025 | "kind": "discovery#directoryItem", 1026 | "id": "youtubeAnalytics:v1beta1", 1027 | "name": "youtubeAnalytics", 1028 | "version": "v1beta1", 1029 | "title": "YouTube Analytics API", 1030 | "description": "Retrieve your YouTube Analytics reports.", 1031 | "discoveryRestUrl": "https://www.googleapis.com/discovery/v1/apis/youtubeAnalytics/v1beta1/rest", 1032 | "discoveryLink": "./apis/youtubeAnalytics/v1beta1/rest", 1033 | "icons": { 1034 | "x16": "http://www.google.com/images/icons/product/youtube-16.png", 1035 | "x32": "http://www.google.com/images/icons/product/youtube-32.png" 1036 | }, 1037 | "documentationLink": "http://developers.google.com/youtube/analytics/", 1038 | "labels": [ 1039 | "graduated" 1040 | ], 1041 | "preferred": false 1042 | } 1043 | ] 1044 | } -------------------------------------------------------------------------------- /data/plus.json: -------------------------------------------------------------------------------- 1 | { 2 | "kind": "discovery#restDescription", 3 | "etag": "\"oZqOFf-aKzMvpID-BwBAFJLe7Pk/sKOWQzkdEBleXJA46F4mcUS7L30\"", 4 | "discoveryVersion": "v1", 5 | "id": "plus:v1", 6 | "name": "plus", 7 | "version": "v1", 8 | "revision": "20120806", 9 | "title": "Google+ API", 10 | "description": "The Google+ API enables developers to build on top of the Google+ platform.", 11 | "icons": { 12 | "x16": "http://www.google.com/images/icons/product/gplus-16.png", 13 | "x32": "http://www.google.com/images/icons/product/gplus-32.png" 14 | }, 15 | "documentationLink": "https://developers.google.com/+/api/", 16 | "protocol": "rest", 17 | "baseUrl": "https://www.googleapis.com/plus/v1/", 18 | "basePath": "/plus/v1/", 19 | "rootUrl": "https://www.googleapis.com/", 20 | "servicePath": "plus/v1/", 21 | "batchPath": "batch", 22 | "parameters": { 23 | "alt": { 24 | "type": "string", 25 | "description": "Data format for the response.", 26 | "default": "json", 27 | "enum": [ 28 | "json" 29 | ], 30 | "enumDescriptions": [ 31 | "Responses with Content-Type of application/json" 32 | ], 33 | "location": "query" 34 | }, 35 | "fields": { 36 | "type": "string", 37 | "description": "Selector specifying which fields to include in a partial response.", 38 | "location": "query" 39 | }, 40 | "key": { 41 | "type": "string", 42 | "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", 43 | "location": "query" 44 | }, 45 | "oauth_token": { 46 | "type": "string", 47 | "description": "OAuth 2.0 token for the current user.", 48 | "location": "query" 49 | }, 50 | "prettyPrint": { 51 | "type": "boolean", 52 | "description": "Returns response with indentations and line breaks.", 53 | "default": "true", 54 | "location": "query" 55 | }, 56 | "quotaUser": { 57 | "type": "string", 58 | "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.", 59 | "location": "query" 60 | }, 61 | "userIp": { 62 | "type": "string", 63 | "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.", 64 | "location": "query" 65 | } 66 | }, 67 | "auth": { 68 | "oauth2": { 69 | "scopes": { 70 | "https://www.googleapis.com/auth/plus.me": { 71 | "description": "Know who you are on Google" 72 | } 73 | } 74 | } 75 | }, 76 | "schemas": { 77 | "Acl": { 78 | "id": "Acl", 79 | "type": "object", 80 | "properties": { 81 | "description": { 82 | "type": "string", 83 | "description": "Description of the access granted, suitable for display." 84 | }, 85 | "items": { 86 | "type": "array", 87 | "description": "The list of access entries.", 88 | "items": { 89 | "$ref": "PlusAclentryResource" 90 | } 91 | }, 92 | "kind": { 93 | "type": "string", 94 | "description": "Identifies this resource as a collection of access controls. Value: \"plus#acl\".", 95 | "default": "plus#acl" 96 | } 97 | } 98 | }, 99 | "Activity": { 100 | "id": "Activity", 101 | "type": "object", 102 | "properties": { 103 | "access": { 104 | "$ref": "Acl", 105 | "description": "Identifies who has access to see this activity." 106 | }, 107 | "actor": { 108 | "type": "object", 109 | "description": "The person who performed this activity.", 110 | "properties": { 111 | "displayName": { 112 | "type": "string", 113 | "description": "The name of the actor, suitable for display." 114 | }, 115 | "id": { 116 | "type": "string", 117 | "description": "The ID of the actor's person resource." 118 | }, 119 | "image": { 120 | "type": "object", 121 | "description": "The image representation of the actor.", 122 | "properties": { 123 | "url": { 124 | "type": "string", 125 | "description": "The URL of the actor's profile photo. To re-size the image and crop it to a square, append the query string ?sz=x, where x is the dimension in pixels of each side." 126 | } 127 | } 128 | }, 129 | "name": { 130 | "type": "object", 131 | "description": "An object representation of the individual components of name.", 132 | "properties": { 133 | "familyName": { 134 | "type": "string", 135 | "description": "The family name (last name) of the actor." 136 | }, 137 | "givenName": { 138 | "type": "string", 139 | "description": "The given name (first name) of the actor." 140 | } 141 | } 142 | }, 143 | "url": { 144 | "type": "string", 145 | "description": "The link to the actor's Google profile." 146 | } 147 | } 148 | }, 149 | "address": { 150 | "type": "string", 151 | "description": "Street address where this activity occurred." 152 | }, 153 | "annotation": { 154 | "type": "string", 155 | "description": "Additional content added by the person who shared this activity, applicable only when resharing an activity." 156 | }, 157 | "crosspostSource": { 158 | "type": "string", 159 | "description": "If this activity is a crosspost from another system, this property specifies the ID of the original activity." 160 | }, 161 | "etag": { 162 | "type": "string", 163 | "description": "ETag of this response for caching purposes." 164 | }, 165 | "geocode": { 166 | "type": "string", 167 | "description": "Latitude and longitude where this activity occurred. Format is latitude followed by longitude, space separated." 168 | }, 169 | "id": { 170 | "type": "string", 171 | "description": "The ID of this activity." 172 | }, 173 | "kind": { 174 | "type": "string", 175 | "description": "Identifies this resource as an activity. Value: \"plus#activity\".", 176 | "default": "plus#activity" 177 | }, 178 | "object": { 179 | "type": "object", 180 | "description": "The object of this activity.", 181 | "properties": { 182 | "actor": { 183 | "type": "object", 184 | "description": "If this activity's object is itself another activity (for example, when a person reshares an activity), this property specifies the original activity's actor.", 185 | "properties": { 186 | "displayName": { 187 | "type": "string", 188 | "description": "The original actor's name, suitable for display." 189 | }, 190 | "id": { 191 | "type": "string", 192 | "description": "ID of the original actor." 193 | }, 194 | "image": { 195 | "type": "object", 196 | "description": "The image representation of the original actor.", 197 | "properties": { 198 | "url": { 199 | "type": "string", 200 | "description": "A URL that points to a thumbnail photo of the original actor." 201 | } 202 | } 203 | }, 204 | "url": { 205 | "type": "string", 206 | "description": "A link to the original actor's Google profile." 207 | } 208 | } 209 | }, 210 | "attachments": { 211 | "type": "array", 212 | "description": "The media objects attached to this activity.", 213 | "items": { 214 | "type": "object", 215 | "properties": { 216 | "content": { 217 | "type": "string", 218 | "description": "If the attachment is an article, this property contains a snippet of text from the article. It can also include descriptions for other types." 219 | }, 220 | "displayName": { 221 | "type": "string", 222 | "description": "The title of the attachment (such as a photo caption or an article title)." 223 | }, 224 | "embed": { 225 | "type": "object", 226 | "description": "If the attachment is a video, the embeddable link.", 227 | "properties": { 228 | "type": { 229 | "type": "string", 230 | "description": "Media type of the link." 231 | }, 232 | "url": { 233 | "type": "string", 234 | "description": "URL of the link." 235 | } 236 | } 237 | }, 238 | "fullImage": { 239 | "type": "object", 240 | "description": "The full image URL for photo attachments.", 241 | "properties": { 242 | "height": { 243 | "type": "integer", 244 | "description": "The height, in pixels, of the linked resource.", 245 | "format": "uint32" 246 | }, 247 | "type": { 248 | "type": "string", 249 | "description": "Media type of the link." 250 | }, 251 | "url": { 252 | "type": "string", 253 | "description": "URL to the image." 254 | }, 255 | "width": { 256 | "type": "integer", 257 | "description": "The width, in pixels, of the linked resource.", 258 | "format": "uint32" 259 | } 260 | } 261 | }, 262 | "id": { 263 | "type": "string", 264 | "description": "The ID of the attachment." 265 | }, 266 | "image": { 267 | "type": "object", 268 | "description": "The preview image for photos or videos.", 269 | "properties": { 270 | "height": { 271 | "type": "integer", 272 | "description": "The height, in pixels, of the linked resource.", 273 | "format": "uint32" 274 | }, 275 | "type": { 276 | "type": "string", 277 | "description": "Media type of the link." 278 | }, 279 | "url": { 280 | "type": "string", 281 | "description": "Image url." 282 | }, 283 | "width": { 284 | "type": "integer", 285 | "description": "The width, in pixels, of the linked resource.", 286 | "format": "uint32" 287 | } 288 | } 289 | }, 290 | "objectType": { 291 | "type": "string", 292 | "description": "The type of media object. Possible values are: \n- \"photo\" - A photo. \n- \"album\" - A photo album. \n- \"video\" - A video. \n- \"article\" - An article, specified by a link." 293 | }, 294 | "thumbnails": { 295 | "type": "array", 296 | "description": "If the attachment is an album, potential additional thumbnails from the album.", 297 | "items": { 298 | "type": "object", 299 | "properties": { 300 | "description": { 301 | "type": "string", 302 | "description": "Potential name of the thumbnail." 303 | }, 304 | "image": { 305 | "type": "object", 306 | "description": "Image resource.", 307 | "properties": { 308 | "height": { 309 | "type": "integer", 310 | "description": "The height, in pixels, of the linked resource.", 311 | "format": "uint32" 312 | }, 313 | "type": { 314 | "type": "string", 315 | "description": "Media type of the link." 316 | }, 317 | "url": { 318 | "type": "string", 319 | "description": "Image url." 320 | }, 321 | "width": { 322 | "type": "integer", 323 | "description": "The width, in pixels, of the linked resource.", 324 | "format": "uint32" 325 | } 326 | } 327 | }, 328 | "url": { 329 | "type": "string", 330 | "description": "URL to the webpage containing the image." 331 | } 332 | } 333 | } 334 | }, 335 | "url": { 336 | "type": "string", 337 | "description": "The link to the attachment, should be of type text/html." 338 | } 339 | } 340 | } 341 | }, 342 | "content": { 343 | "type": "string", 344 | "description": "The HTML-formatted content, suitable for display." 345 | }, 346 | "id": { 347 | "type": "string", 348 | "description": "The ID of the object. When resharing an activity, this is the ID of the activity being reshared." 349 | }, 350 | "objectType": { 351 | "type": "string", 352 | "description": "The type of the object. Possible values are: \n- \"note\" - Textual content. \n- \"activity\" - A Google+ activity." 353 | }, 354 | "originalContent": { 355 | "type": "string", 356 | "description": "The content (text) as provided by the author, stored without any HTML formatting. When creating or updating an activity, this value must be supplied as plain text in the request." 357 | }, 358 | "plusoners": { 359 | "type": "object", 360 | "description": "People who +1'd this activity.", 361 | "properties": { 362 | "selfLink": { 363 | "type": "string", 364 | "description": "The URL for the collection of people who +1'd this activity." 365 | }, 366 | "totalItems": { 367 | "type": "integer", 368 | "description": "Total number of people who +1'd this activity.", 369 | "format": "uint32" 370 | } 371 | } 372 | }, 373 | "replies": { 374 | "type": "object", 375 | "description": "Comments in reply to this activity.", 376 | "properties": { 377 | "selfLink": { 378 | "type": "string", 379 | "description": "The URL for the collection of comments in reply to this activity." 380 | }, 381 | "totalItems": { 382 | "type": "integer", 383 | "description": "Total number of comments on this activity.", 384 | "format": "uint32" 385 | } 386 | } 387 | }, 388 | "resharers": { 389 | "type": "object", 390 | "description": "People who reshared this activity.", 391 | "properties": { 392 | "selfLink": { 393 | "type": "string", 394 | "description": "The URL for the collection of resharers." 395 | }, 396 | "totalItems": { 397 | "type": "integer", 398 | "description": "Total number of people who reshared this activity.", 399 | "format": "uint32" 400 | } 401 | } 402 | }, 403 | "url": { 404 | "type": "string", 405 | "description": "The URL that points to the linked resource." 406 | } 407 | } 408 | }, 409 | "placeId": { 410 | "type": "string", 411 | "description": "ID of the place where this activity occurred." 412 | }, 413 | "placeName": { 414 | "type": "string", 415 | "description": "Name of the place where this activity occurred." 416 | }, 417 | "provider": { 418 | "type": "object", 419 | "description": "The service provider that initially published this activity.", 420 | "properties": { 421 | "title": { 422 | "type": "string", 423 | "description": "Name of the service provider." 424 | } 425 | } 426 | }, 427 | "published": { 428 | "type": "string", 429 | "description": "The time at which this activity was initially published. Formatted as an RFC 3339 timestamp.", 430 | "format": "date-time" 431 | }, 432 | "radius": { 433 | "type": "string", 434 | "description": "Radius, in meters, of the region where this activity occurred, centered at the latitude and longitude identified in geocode." 435 | }, 436 | "title": { 437 | "type": "string", 438 | "description": "Title of this activity." 439 | }, 440 | "updated": { 441 | "type": "string", 442 | "description": "The time at which this activity was last updated. Formatted as an RFC 3339 timestamp.", 443 | "format": "date-time" 444 | }, 445 | "url": { 446 | "type": "string", 447 | "description": "The link to this activity." 448 | }, 449 | "verb": { 450 | "type": "string", 451 | "description": "This activity's verb, indicating what action was performed. Possible values are: \n- \"checkin\" - Check in to a location. \n- \"post\" - Publish content to the stream. \n- \"share\" - Reshare an activity." 452 | } 453 | } 454 | }, 455 | "ActivityFeed": { 456 | "id": "ActivityFeed", 457 | "type": "object", 458 | "properties": { 459 | "etag": { 460 | "type": "string", 461 | "description": "ETag of this response for caching purposes." 462 | }, 463 | "id": { 464 | "type": "string", 465 | "description": "The ID of this collection of activities." 466 | }, 467 | "items": { 468 | "type": "array", 469 | "description": "The activities in this page of results.", 470 | "items": { 471 | "$ref": "Activity" 472 | } 473 | }, 474 | "kind": { 475 | "type": "string", 476 | "description": "Identifies this resource as a collection of activities. Value: \"plus#activityFeed\".", 477 | "default": "plus#activityFeed" 478 | }, 479 | "nextLink": { 480 | "type": "string", 481 | "description": "Link to the next page of activities." 482 | }, 483 | "nextPageToken": { 484 | "type": "string", 485 | "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results." 486 | }, 487 | "selfLink": { 488 | "type": "string", 489 | "description": "Link to this activity resource." 490 | }, 491 | "title": { 492 | "type": "string", 493 | "description": "The title of this collection of activities." 494 | }, 495 | "updated": { 496 | "type": "string", 497 | "description": "The time at which this collection of activities was last updated. Formatted as an RFC 3339 timestamp.", 498 | "format": "date-time" 499 | } 500 | } 501 | }, 502 | "Comment": { 503 | "id": "Comment", 504 | "type": "object", 505 | "properties": { 506 | "actor": { 507 | "type": "object", 508 | "description": "The person who posted this comment.", 509 | "properties": { 510 | "displayName": { 511 | "type": "string", 512 | "description": "The name of this actor, suitable for display." 513 | }, 514 | "id": { 515 | "type": "string", 516 | "description": "The ID of the actor." 517 | }, 518 | "image": { 519 | "type": "object", 520 | "description": "The image representation of this actor.", 521 | "properties": { 522 | "url": { 523 | "type": "string", 524 | "description": "The URL of the actor's profile photo. To re-size the image and crop it to a square, append the query string ?sz=x, where x is the dimension in pixels of each side." 525 | } 526 | } 527 | }, 528 | "url": { 529 | "type": "string", 530 | "description": "A link to the person resource for this actor." 531 | } 532 | } 533 | }, 534 | "etag": { 535 | "type": "string", 536 | "description": "ETag of this response for caching purposes." 537 | }, 538 | "id": { 539 | "type": "string", 540 | "description": "The ID of this comment." 541 | }, 542 | "inReplyTo": { 543 | "type": "array", 544 | "description": "The activity this comment replied to.", 545 | "items": { 546 | "type": "object", 547 | "properties": { 548 | "id": { 549 | "type": "string", 550 | "description": "The ID of the activity." 551 | }, 552 | "url": { 553 | "type": "string", 554 | "description": "The URL of the activity." 555 | } 556 | } 557 | } 558 | }, 559 | "kind": { 560 | "type": "string", 561 | "description": "Identifies this resource as a comment. Value: \"plus#comment\".", 562 | "default": "plus#comment" 563 | }, 564 | "object": { 565 | "type": "object", 566 | "description": "The object of this comment.", 567 | "properties": { 568 | "content": { 569 | "type": "string", 570 | "description": "The HTML-formatted content, suitable for display." 571 | }, 572 | "objectType": { 573 | "type": "string", 574 | "description": "The object type of this comment. Possible values are: \n- \"comment\" - A comment in reply to an activity.", 575 | "default": "comment" 576 | }, 577 | "originalContent": { 578 | "type": "string", 579 | "description": "The content (text) as provided by the author, stored without any HTML formatting. When creating or updating a comment, this value must be supplied as plain text in the request." 580 | } 581 | } 582 | }, 583 | "plusoners": { 584 | "type": "object", 585 | "description": "People who +1'd this comment.", 586 | "properties": { 587 | "totalItems": { 588 | "type": "integer", 589 | "description": "Total number of people who +1'd this comment.", 590 | "format": "uint32" 591 | } 592 | } 593 | }, 594 | "published": { 595 | "type": "string", 596 | "description": "The time at which this comment was initially published. Formatted as an RFC 3339 timestamp.", 597 | "format": "date-time" 598 | }, 599 | "selfLink": { 600 | "type": "string", 601 | "description": "Link to this comment resource." 602 | }, 603 | "updated": { 604 | "type": "string", 605 | "description": "The time at which this comment was last updated. Formatted as an RFC 3339 timestamp.", 606 | "format": "date-time" 607 | }, 608 | "verb": { 609 | "type": "string", 610 | "description": "This comment's verb, indicating what action was performed. Possible values are: \n- \"post\" - Publish content to the stream.", 611 | "default": "post" 612 | } 613 | } 614 | }, 615 | "CommentFeed": { 616 | "id": "CommentFeed", 617 | "type": "object", 618 | "properties": { 619 | "etag": { 620 | "type": "string", 621 | "description": "ETag of this response for caching purposes." 622 | }, 623 | "id": { 624 | "type": "string", 625 | "description": "The ID of this collection of comments." 626 | }, 627 | "items": { 628 | "type": "array", 629 | "description": "The comments in this page of results.", 630 | "items": { 631 | "$ref": "Comment" 632 | } 633 | }, 634 | "kind": { 635 | "type": "string", 636 | "description": "Identifies this resource as a collection of comments. Value: \"plus#commentFeed\".", 637 | "default": "plus#commentFeed" 638 | }, 639 | "nextLink": { 640 | "type": "string", 641 | "description": "Link to the next page of activities." 642 | }, 643 | "nextPageToken": { 644 | "type": "string", 645 | "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results." 646 | }, 647 | "title": { 648 | "type": "string", 649 | "description": "The title of this collection of comments." 650 | }, 651 | "updated": { 652 | "type": "string", 653 | "description": "The time at which this collection of comments was last updated. Formatted as an RFC 3339 timestamp.", 654 | "format": "date-time" 655 | } 656 | } 657 | }, 658 | "PeopleFeed": { 659 | "id": "PeopleFeed", 660 | "type": "object", 661 | "properties": { 662 | "etag": { 663 | "type": "string", 664 | "description": "ETag of this response for caching purposes." 665 | }, 666 | "items": { 667 | "type": "array", 668 | "description": "The people in this page of results. Each item includes the id, displayName, image, and url for the person. To retrieve additional profile data, see the people.get method.", 669 | "items": { 670 | "$ref": "Person" 671 | } 672 | }, 673 | "kind": { 674 | "type": "string", 675 | "description": "Identifies this resource as a collection of people. Value: \"plus#peopleFeed\".", 676 | "default": "plus#peopleFeed" 677 | }, 678 | "nextPageToken": { 679 | "type": "string", 680 | "description": "The continuation token, which is used to page through large result sets. Provide this value in a subsequent request to return the next page of results." 681 | }, 682 | "selfLink": { 683 | "type": "string", 684 | "description": "Link to this resource." 685 | }, 686 | "title": { 687 | "type": "string", 688 | "description": "The title of this collection of people." 689 | }, 690 | "totalItems": { 691 | "type": "integer", 692 | "description": "The total number of people available in this list. The number of people in a response might be smaller due to paging. This might not be set for all collections.", 693 | "format": "int32" 694 | } 695 | } 696 | }, 697 | "Person": { 698 | "id": "Person", 699 | "type": "object", 700 | "properties": { 701 | "aboutMe": { 702 | "type": "string", 703 | "description": "A short biography for this person." 704 | }, 705 | "birthday": { 706 | "type": "string", 707 | "description": "The person's date of birth, represented as YYYY-MM-DD." 708 | }, 709 | "currentLocation": { 710 | "type": "string", 711 | "description": "The current location for this person." 712 | }, 713 | "displayName": { 714 | "type": "string", 715 | "description": "The name of this person, suitable for display." 716 | }, 717 | "emails": { 718 | "type": "array", 719 | "description": "A list of email addresses for this person.", 720 | "items": { 721 | "type": "object", 722 | "properties": { 723 | "primary": { 724 | "type": "boolean", 725 | "description": "If \"true\", indicates this email address is the person's primary one." 726 | }, 727 | "type": { 728 | "type": "string", 729 | "description": "The type of address. Possible values are: \n- \"home\" - Home email address. \n- \"work\" - Work email address. \n- \"other\" - Other." 730 | }, 731 | "value": { 732 | "type": "string", 733 | "description": "The email address." 734 | } 735 | } 736 | } 737 | }, 738 | "etag": { 739 | "type": "string", 740 | "description": "ETag of this response for caching purposes." 741 | }, 742 | "gender": { 743 | "type": "string", 744 | "description": "The person's gender. Possible values are: \n- \"male\" - Male gender. \n- \"female\" - Female gender. \n- \"other\" - Other." 745 | }, 746 | "hasApp": { 747 | "type": "boolean", 748 | "description": "If \"true\", indicates that the person has installed the app that is making the request and has chosen to expose this install state to the caller. A value of \"false\" indicates that the install state cannot be determined (it is either not installed or the person has chosen to keep this information private)." 749 | }, 750 | "id": { 751 | "type": "string", 752 | "description": "The ID of this person." 753 | }, 754 | "image": { 755 | "type": "object", 756 | "description": "The representation of the person's profile photo.", 757 | "properties": { 758 | "url": { 759 | "type": "string", 760 | "description": "The URL of the person's profile photo. To re-size the image and crop it to a square, append the query string ?sz=x, where x is the dimension in pixels of each side." 761 | } 762 | } 763 | }, 764 | "isPlusUser": { 765 | "type": "boolean", 766 | "description": "Whether this user has signed up for G+." 767 | }, 768 | "kind": { 769 | "type": "string", 770 | "description": "Identifies this resource as a person. Value: \"plus#person\".", 771 | "default": "plus#person" 772 | }, 773 | "name": { 774 | "type": "object", 775 | "description": "An object representation of the individual components of a person's name.", 776 | "properties": { 777 | "familyName": { 778 | "type": "string", 779 | "description": "The family name (last name) of this person." 780 | }, 781 | "formatted": { 782 | "type": "string", 783 | "description": "The full name of this person, including middle names, suffixes, etc." 784 | }, 785 | "givenName": { 786 | "type": "string", 787 | "description": "The given name (first name) of this person." 788 | }, 789 | "honorificPrefix": { 790 | "type": "string", 791 | "description": "The honorific prefixes (such as \"Dr.\" or \"Mrs.\") for this person." 792 | }, 793 | "honorificSuffix": { 794 | "type": "string", 795 | "description": "The honorific suffixes (such as \"Jr.\") for this person." 796 | }, 797 | "middleName": { 798 | "type": "string", 799 | "description": "The middle name of this person." 800 | } 801 | } 802 | }, 803 | "nickname": { 804 | "type": "string", 805 | "description": "The nickname of this person." 806 | }, 807 | "objectType": { 808 | "type": "string", 809 | "description": "Type of person within Google+. Possible values are: \n- \"person\" - represents an actual person. \n- \"page\" - represents a page." 810 | }, 811 | "organizations": { 812 | "type": "array", 813 | "description": "A list of current or past organizations with which this person is associated.", 814 | "items": { 815 | "type": "object", 816 | "properties": { 817 | "department": { 818 | "type": "string", 819 | "description": "The department within the organization. Deprecated." 820 | }, 821 | "description": { 822 | "type": "string", 823 | "description": "A short description of the person's role in this organization. Deprecated." 824 | }, 825 | "endDate": { 826 | "type": "string", 827 | "description": "The date the person left this organization." 828 | }, 829 | "location": { 830 | "type": "string", 831 | "description": "The location of this organization. Deprecated." 832 | }, 833 | "name": { 834 | "type": "string", 835 | "description": "The name of the organization." 836 | }, 837 | "primary": { 838 | "type": "boolean", 839 | "description": "If \"true\", indicates this organization is the person's primary one (typically interpreted as current one)." 840 | }, 841 | "startDate": { 842 | "type": "string", 843 | "description": "The date the person joined this organization." 844 | }, 845 | "title": { 846 | "type": "string", 847 | "description": "The person's job title or role within the organization." 848 | }, 849 | "type": { 850 | "type": "string", 851 | "description": "The type of organization. Possible values are: \n- \"work\" - Work. \n- \"school\" - School." 852 | } 853 | } 854 | } 855 | }, 856 | "placesLived": { 857 | "type": "array", 858 | "description": "A list of places where this person has lived.", 859 | "items": { 860 | "type": "object", 861 | "properties": { 862 | "primary": { 863 | "type": "boolean", 864 | "description": "If \"true\", this place of residence is this person's primary residence." 865 | }, 866 | "value": { 867 | "type": "string", 868 | "description": "A place where this person has lived. For example: \"Seattle, WA\", \"Near Toronto\"." 869 | } 870 | } 871 | } 872 | }, 873 | "relationshipStatus": { 874 | "type": "string", 875 | "description": "The person's relationship status. Possible values are: \n- \"single\" - Person is single. \n- \"in_a_relationship\" - Person is in a relationship. \n- \"engaged\" - Person is engaged. \n- \"married\" - Person is married. \n- \"its_complicated\" - The relationship is complicated. \n- \"open_relationship\" - Person is in an open relationship. \n- \"widowed\" - Person is widowed. \n- \"in_domestic_partnership\" - Person is in a domestic partnership. \n- \"in_civil_union\" - Person is in a civil union." 876 | }, 877 | "tagline": { 878 | "type": "string", 879 | "description": "The brief description (tagline) of this person." 880 | }, 881 | "url": { 882 | "type": "string", 883 | "description": "The URL of this person's profile." 884 | }, 885 | "urls": { 886 | "type": "array", 887 | "description": "A list of URLs for this person.", 888 | "items": { 889 | "type": "object", 890 | "properties": { 891 | "primary": { 892 | "type": "boolean", 893 | "description": "If \"true\", this URL is the person's primary URL." 894 | }, 895 | "type": { 896 | "type": "string", 897 | "description": "The type of URL. Possible values are: \n- \"home\" - URL for home. \n- \"work\" - URL for work. \n- \"blog\" - URL for blog. \n- \"profile\" - URL for profile. \n- \"other\" - Other." 898 | }, 899 | "value": { 900 | "type": "string", 901 | "description": "The URL value." 902 | } 903 | } 904 | } 905 | } 906 | } 907 | }, 908 | "PlusAclentryResource": { 909 | "id": "PlusAclentryResource", 910 | "type": "object", 911 | "properties": { 912 | "displayName": { 913 | "type": "string", 914 | "description": "A descriptive name for this entry. Suitable for display." 915 | }, 916 | "id": { 917 | "type": "string", 918 | "description": "The ID of the entry. For entries of type \"person\" or \"circle\", this is the ID of the resource. For other types, this property is not set." 919 | }, 920 | "type": { 921 | "type": "string", 922 | "description": "The type of entry describing to whom access is granted. Possible values are: \n- \"person\" - Access to an individual. \n- \"circle\" - Access to members of a circle. \n- \"myCircles\" - Access to members of all the person's circles. \n- \"extendedCircles\" - Access to members of everyone in a person's circles, plus all of the people in their circles. \n- \"public\" - Access to anyone on the web." 923 | } 924 | } 925 | } 926 | }, 927 | "resources": { 928 | "activities": { 929 | "methods": { 930 | "get": { 931 | "id": "plus.activities.get", 932 | "path": "activities/{activityId}", 933 | "httpMethod": "GET", 934 | "description": "Get an activity.", 935 | "parameters": { 936 | "activityId": { 937 | "type": "string", 938 | "description": "The ID of the activity to get.", 939 | "required": true, 940 | "location": "path" 941 | } 942 | }, 943 | "parameterOrder": [ 944 | "activityId" 945 | ], 946 | "response": { 947 | "$ref": "Activity" 948 | }, 949 | "scopes": [ 950 | "https://www.googleapis.com/auth/plus.me" 951 | ] 952 | }, 953 | "list": { 954 | "id": "plus.activities.list", 955 | "path": "people/{userId}/activities/{collection}", 956 | "httpMethod": "GET", 957 | "description": "List all of the activities in the specified collection for a particular user.", 958 | "parameters": { 959 | "collection": { 960 | "type": "string", 961 | "description": "The collection of activities to list.", 962 | "required": true, 963 | "enum": [ 964 | "public" 965 | ], 966 | "enumDescriptions": [ 967 | "All public activities created by the specified user." 968 | ], 969 | "location": "path" 970 | }, 971 | "maxResults": { 972 | "type": "integer", 973 | "description": "The maximum number of activities to include in the response, which is used for paging. For any response, the actual number returned might be less than the specified maxResults.", 974 | "default": "20", 975 | "format": "uint32", 976 | "minimum": "1", 977 | "maximum": "100", 978 | "location": "query" 979 | }, 980 | "pageToken": { 981 | "type": "string", 982 | "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of \"nextPageToken\" from the previous response.", 983 | "location": "query" 984 | }, 985 | "userId": { 986 | "type": "string", 987 | "description": "The ID of the user to get activities for. The special value \"me\" can be used to indicate the authenticated user.", 988 | "required": true, 989 | "location": "path" 990 | } 991 | }, 992 | "parameterOrder": [ 993 | "userId", 994 | "collection" 995 | ], 996 | "response": { 997 | "$ref": "ActivityFeed" 998 | }, 999 | "scopes": [ 1000 | "https://www.googleapis.com/auth/plus.me" 1001 | ] 1002 | }, 1003 | "search": { 1004 | "id": "plus.activities.search", 1005 | "path": "activities", 1006 | "httpMethod": "GET", 1007 | "description": "Search public activities.", 1008 | "parameters": { 1009 | "language": { 1010 | "type": "string", 1011 | "description": "Specify the preferred language to search with. See search language codes for available values.", 1012 | "default": "en-US", 1013 | "location": "query" 1014 | }, 1015 | "maxResults": { 1016 | "type": "integer", 1017 | "description": "The maximum number of activities to include in the response, which is used for paging. For any response, the actual number returned might be less than the specified maxResults.", 1018 | "default": "10", 1019 | "format": "uint32", 1020 | "minimum": "1", 1021 | "maximum": "20", 1022 | "location": "query" 1023 | }, 1024 | "orderBy": { 1025 | "type": "string", 1026 | "description": "Specifies how to order search results.", 1027 | "default": "recent", 1028 | "enum": [ 1029 | "best", 1030 | "recent" 1031 | ], 1032 | "enumDescriptions": [ 1033 | "Sort activities by relevance to the user, most relevant first.", 1034 | "Sort activities by published date, most recent first." 1035 | ], 1036 | "location": "query" 1037 | }, 1038 | "pageToken": { 1039 | "type": "string", 1040 | "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of \"nextPageToken\" from the previous response. This token can be of any length.", 1041 | "location": "query" 1042 | }, 1043 | "query": { 1044 | "type": "string", 1045 | "description": "Full-text search query string.", 1046 | "required": true, 1047 | "location": "query" 1048 | } 1049 | }, 1050 | "parameterOrder": [ 1051 | "query" 1052 | ], 1053 | "response": { 1054 | "$ref": "ActivityFeed" 1055 | }, 1056 | "scopes": [ 1057 | "https://www.googleapis.com/auth/plus.me" 1058 | ] 1059 | } 1060 | } 1061 | }, 1062 | "comments": { 1063 | "methods": { 1064 | "get": { 1065 | "id": "plus.comments.get", 1066 | "path": "comments/{commentId}", 1067 | "httpMethod": "GET", 1068 | "description": "Get a comment.", 1069 | "parameters": { 1070 | "commentId": { 1071 | "type": "string", 1072 | "description": "The ID of the comment to get.", 1073 | "required": true, 1074 | "location": "path" 1075 | } 1076 | }, 1077 | "parameterOrder": [ 1078 | "commentId" 1079 | ], 1080 | "response": { 1081 | "$ref": "Comment" 1082 | }, 1083 | "scopes": [ 1084 | "https://www.googleapis.com/auth/plus.me" 1085 | ] 1086 | }, 1087 | "list": { 1088 | "id": "plus.comments.list", 1089 | "path": "activities/{activityId}/comments", 1090 | "httpMethod": "GET", 1091 | "description": "List all of the comments for an activity.", 1092 | "parameters": { 1093 | "activityId": { 1094 | "type": "string", 1095 | "description": "The ID of the activity to get comments for.", 1096 | "required": true, 1097 | "location": "path" 1098 | }, 1099 | "maxResults": { 1100 | "type": "integer", 1101 | "description": "The maximum number of comments to include in the response, which is used for paging. For any response, the actual number returned might be less than the specified maxResults.", 1102 | "default": "20", 1103 | "format": "uint32", 1104 | "minimum": "0", 1105 | "maximum": "500", 1106 | "location": "query" 1107 | }, 1108 | "pageToken": { 1109 | "type": "string", 1110 | "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of \"nextPageToken\" from the previous response.", 1111 | "location": "query" 1112 | }, 1113 | "sortOrder": { 1114 | "type": "string", 1115 | "description": "The order in which to sort the list of comments.", 1116 | "default": "ascending", 1117 | "enum": [ 1118 | "ascending", 1119 | "descending" 1120 | ], 1121 | "enumDescriptions": [ 1122 | "Sort oldest comments first.", 1123 | "Sort newest comments first." 1124 | ], 1125 | "location": "query" 1126 | } 1127 | }, 1128 | "parameterOrder": [ 1129 | "activityId" 1130 | ], 1131 | "response": { 1132 | "$ref": "CommentFeed" 1133 | }, 1134 | "scopes": [ 1135 | "https://www.googleapis.com/auth/plus.me" 1136 | ] 1137 | } 1138 | } 1139 | }, 1140 | "people": { 1141 | "methods": { 1142 | "get": { 1143 | "id": "plus.people.get", 1144 | "path": "people/{userId}", 1145 | "httpMethod": "GET", 1146 | "description": "Get a person's profile.", 1147 | "parameters": { 1148 | "userId": { 1149 | "type": "string", 1150 | "description": "The ID of the person to get the profile for. The special value \"me\" can be used to indicate the authenticated user.", 1151 | "required": true, 1152 | "location": "path" 1153 | } 1154 | }, 1155 | "parameterOrder": [ 1156 | "userId" 1157 | ], 1158 | "response": { 1159 | "$ref": "Person" 1160 | }, 1161 | "scopes": [ 1162 | "https://www.googleapis.com/auth/plus.me" 1163 | ] 1164 | }, 1165 | "listByActivity": { 1166 | "id": "plus.people.listByActivity", 1167 | "path": "activities/{activityId}/people/{collection}", 1168 | "httpMethod": "GET", 1169 | "description": "List all of the people in the specified collection for a particular activity.", 1170 | "parameters": { 1171 | "activityId": { 1172 | "type": "string", 1173 | "description": "The ID of the activity to get the list of people for.", 1174 | "required": true, 1175 | "location": "path" 1176 | }, 1177 | "collection": { 1178 | "type": "string", 1179 | "description": "The collection of people to list.", 1180 | "required": true, 1181 | "enum": [ 1182 | "plusoners", 1183 | "resharers" 1184 | ], 1185 | "enumDescriptions": [ 1186 | "List all people who have +1'd this activity.", 1187 | "List all people who have reshared this activity." 1188 | ], 1189 | "location": "path" 1190 | }, 1191 | "maxResults": { 1192 | "type": "integer", 1193 | "description": "The maximum number of people to include in the response, which is used for paging. For any response, the actual number returned might be less than the specified maxResults.", 1194 | "default": "20", 1195 | "format": "uint32", 1196 | "minimum": "1", 1197 | "maximum": "100", 1198 | "location": "query" 1199 | }, 1200 | "pageToken": { 1201 | "type": "string", 1202 | "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of \"nextPageToken\" from the previous response.", 1203 | "location": "query" 1204 | } 1205 | }, 1206 | "parameterOrder": [ 1207 | "activityId", 1208 | "collection" 1209 | ], 1210 | "response": { 1211 | "$ref": "PeopleFeed" 1212 | }, 1213 | "scopes": [ 1214 | "https://www.googleapis.com/auth/plus.me" 1215 | ] 1216 | }, 1217 | "search": { 1218 | "id": "plus.people.search", 1219 | "path": "people", 1220 | "httpMethod": "GET", 1221 | "description": "Search all public profiles.", 1222 | "parameters": { 1223 | "language": { 1224 | "type": "string", 1225 | "description": "Specify the preferred language to search with. See search language codes for available values.", 1226 | "default": "en-US", 1227 | "location": "query" 1228 | }, 1229 | "maxResults": { 1230 | "type": "integer", 1231 | "description": "The maximum number of people to include in the response, which is used for paging. For any response, the actual number returned might be less than the specified maxResults.", 1232 | "default": "10", 1233 | "format": "uint32", 1234 | "minimum": "1", 1235 | "maximum": "20", 1236 | "location": "query" 1237 | }, 1238 | "pageToken": { 1239 | "type": "string", 1240 | "description": "The continuation token, which is used to page through large result sets. To get the next page of results, set this parameter to the value of \"nextPageToken\" from the previous response. This token can be of any length.", 1241 | "location": "query" 1242 | }, 1243 | "query": { 1244 | "type": "string", 1245 | "description": "Specify a query string for full text search of public text in all profiles.", 1246 | "required": true, 1247 | "location": "query" 1248 | } 1249 | }, 1250 | "parameterOrder": [ 1251 | "query" 1252 | ], 1253 | "response": { 1254 | "$ref": "PeopleFeed" 1255 | }, 1256 | "scopes": [ 1257 | "https://www.googleapis.com/auth/plus.me" 1258 | ] 1259 | } 1260 | } 1261 | } 1262 | } 1263 | } --------------------------------------------------------------------------------