# file generated using the following command (open the link in browser for up-to-date version with html links)
# o=$(sed -n '1,3p' Google-TOS; lynx -dump http://www.google.com/intl/en/policies/terms/); echo "$o" > Google-TOS

                                   [1]Google

[2]Policies & Principles

   [3]Skip to content

    1. [4]Overview
    2. Terms of Service

     * Terms of Service
     * [5]Updates

                            Google Terms of Service

   Last modified: November 11, 2013 ([6]view archived versions)

Welcome to Google!

   Thanks for using our products and services (“Services”). The Services are
   provided by Google Inc. (“Google”), located at 1600 Amphitheatre Parkway,
   Mountain View, CA 94043, United States.

   By using our Services, you are agreeing to these terms. Please read them
   carefully.

   Our Services are very diverse, so sometimes additional terms or product
   requirements (including age requirements) may apply. Additional terms will
   be available with the relevant Services, and those additional terms become
   part of your agreement with us if you use those Services.

Using our Services

   You must follow any policies made available to you within the Services.

   Don’t misuse our Services. For example, don’t interfere with our Services
   or try to access them using a method other than the interface and the
   instructions that we provide. You may use our Services only as permitted
   by law, including applicable export and re-export control laws and
   regulations. We may suspend or stop providing our Services to you if you
   do not comply with our terms or policies or if we are investigating
   suspected misconduct.

   Using our Services does not give you ownership of any intellectual
   property rights in our Services or the content you access. You may not use
   content from our Services unless you obtain permission from its owner or
   are otherwise permitted by law. These terms do not grant you the right to
   use any branding or logos used in our Services. Don’t remove, obscure, or
   alter any legal notices displayed in or along with our Services.

   Our Services display some content that is not Google’s. This content is
   the sole responsibility of the entity that makes it available. We may
   review content to determine whether it is illegal or violates our
   policies, and we may remove or refuse to display content that we
   reasonably believe violates our policies or the law. But that does not
   necessarily mean that we review content, so please don’t assume that we
   do.

   In connection with your use of the Services, we may send you service
   announcements, administrative messages, and other information. You may opt
   out of some of those communications.

   Some of our Services are available on mobile devices. Do not use such
   Services in a way that distracts you and prevents you from obeying traffic
   or safety laws.

Your Google Account

   You may need a Google Account in order to use some of our Services. You
   may create your own Google Account, or your Google Account may be assigned
   to you by an administrator, such as your employer or educational
   institution. If you are using a Google Account assigned to you by an
   administrator, different or additional terms may apply and your
   administrator may be able to access or disable your account.

   To protect your Google Account, keep your password confidential. You are
   responsible for the activity that happens on or through your Google
   Account. Try not to reuse your Google Account password on third-party
   applications. If you learn of any unauthorized use of your password or
   Google Account, [7]follow these instructions.

Privacy and Copyright Protection

   Google’s [8]privacy policies explain how we treat your personal data and
   protect your privacy when you use our Services. By using our Services, you
   agree that Google can use such data in accordance with our privacy
   policies.

   We respond to notices of alleged copyright infringement and terminate
   accounts of repeat infringers according to the process set out in the U.S.
   Digital Millennium Copyright Act.

   We provide information to help copyright holders manage their intellectual
   property online. If you think somebody is violating your copyrights and
   want to notify us, you can find information about submitting notices and
   Google’s policy about responding to notices [9]in our Help Center.

Your Content in our Services

   Some of our Services allow you to submit content. You retain ownership of
   any intellectual property rights that you hold in that content. In short,
   what belongs to you stays yours.

   When you upload or otherwise submit content to our Services, you give
   Google (and those we work with) a worldwide license to use, host, store,
   reproduce, modify, create derivative works (such as those resulting from
   translations, adaptations or other changes we make so that your content
   works better with our Services), communicate, publish, publicly perform,
   publicly display and distribute such content. The rights you grant in this
   license are for the limited purpose of operating, promoting, and improving
   our Services, and to develop new ones. This license continues even if you
   stop using our Services (for example, for a business listing you have
   added to Google Maps). Some Services may offer you ways to access and
   remove content that has been provided to that Service. Also, in some of
   our Services, there are terms or settings that narrow the scope of our use
   of the content submitted in those Services. Make sure you have the
   necessary rights to grant us this license for any content that you submit
   to our Services.

   If you have a Google Account, we may display your Profile name, Profile
   photo, and actions you take on Google or on third-party applications
   connected to your Google Account (such as +1’s, reviews you write and
   comments you post) in our Services, including displaying in ads and other
   commercial contexts. We will respect the choices you make to limit sharing
   or visibility settings in your Google Account. For example, you can choose
   your settings so your name and photo do not appear in an ad.

   You can find more information about how Google uses and stores content in
   the privacy policy or additional terms for particular Services. If you
   submit feedback or suggestions about our Services, we may use your
   feedback or suggestions without obligation to you.

About Software in our Services

   When a Service requires or includes downloadable software, this software
   may update automatically on your device once a new version or feature is
   available. Some Services may let you adjust your automatic update
   settings.

   Google gives you a personal, worldwide, royalty-free, non-assignable and
   non-exclusive license to use the software provided to you by Google as
   part of the Services. This license is for the sole purpose of enabling you
   to use and enjoy the benefit of the Services as provided by Google, in the
   manner permitted by these terms. You may not copy, modify, distribute,
   sell, or lease any part of our Services or included software, nor may you
   reverse engineer or attempt to extract the source code of that software,
   unless laws prohibit those restrictions or you have our written
   permission.

   Open source software is important to us. Some software used in our
   Services may be offered under an open source license that we will make
   available to you. There may be provisions in the open source license that
   expressly override some of these terms.

Modifying and Terminating our Services

   We are constantly changing and improving our Services. We may add or
   remove functionalities or features, and we may suspend or stop a Service
   altogether.

   You can stop using our Services at any time, although we’ll be sorry to
   see you go. Google may also stop providing Services to you, or add or
   create new limits to our Services at any time.

   We believe that you own your data and preserving your access to such data
   is important. If we discontinue a Service, where reasonably possible, we
   will give you reasonable advance notice and a chance to get information
   out of that Service.

Our Warranties and Disclaimers

   We provide our Services using a commercially reasonable level of skill and
   care and we hope that you will enjoy using them. But there are certain
   things that we don’t promise about our Services.

   OTHER THAN AS EXPRESSLY SET OUT IN THESE TERMS OR ADDITIONAL TERMS,
   NEITHER GOOGLE NOR ITS SUPPLIERS OR DISTRIBUTORS MAKE ANY SPECIFIC
   PROMISES ABOUT THE SERVICES. FOR EXAMPLE, WE DON’T MAKE ANY COMMITMENTS
   ABOUT THE CONTENT WITHIN THE SERVICES, THE SPECIFIC FUNCTIONS OF THE
   SERVICES, OR THEIR RELIABILITY, AVAILABILITY, OR ABILITY TO MEET YOUR
   NEEDS. WE PROVIDE THE SERVICES “AS IS”.

   SOME JURISDICTIONS PROVIDE FOR CERTAIN WARRANTIES, LIKE THE IMPLIED
   WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
   NON-INFRINGEMENT. TO THE EXTENT PERMITTED BY LAW, WE EXCLUDE ALL
   WARRANTIES.

Liability for our Services

   WHEN PERMITTED BY LAW, GOOGLE, AND GOOGLE’S SUPPLIERS AND DISTRIBUTORS,
   WILL NOT BE RESPONSIBLE FOR LOST PROFITS, REVENUES, OR DATA, FINANCIAL
   LOSSES OR INDIRECT, SPECIAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE
   DAMAGES.

   TO THE EXTENT PERMITTED BY LAW, THE TOTAL LIABILITY OF GOOGLE, AND ITS
   SUPPLIERS AND DISTRIBUTORS, FOR ANY CLAIMS UNDER THESE TERMS, INCLUDING
   FOR ANY IMPLIED WARRANTIES, IS LIMITED TO THE AMOUNT YOU PAID US TO USE
   THE SERVICES (OR, IF WE CHOOSE, TO SUPPLYING YOU THE SERVICES AGAIN).

   IN ALL CASES, GOOGLE, AND ITS SUPPLIERS AND DISTRIBUTORS, WILL NOT BE
   LIABLE FOR ANY LOSS OR DAMAGE THAT IS NOT REASONABLY FORESEEABLE.

Business uses of our Services

   If you are using our Services on behalf of a business, that business
   accepts these terms. It will hold harmless and indemnify Google and its
   affiliates, officers, agents, and employees from any claim, suit or action
   arising from or related to the use of the Services or violation of these
   terms, including any liability or expense arising from claims, losses,
   damages, suits, judgments, litigation costs and attorneys’ fees.

About these Terms

   We may modify these terms or any additional terms that apply to a Service
   to, for example, reflect changes to the law or changes to our Services.
   You should look at the terms regularly. We’ll post notice of modifications
   to these terms on this page. We’ll post notice of modified additional
   terms in the applicable Service. Changes will not apply retroactively and
   will become effective no sooner than fourteen days after they are posted.
   However, changes addressing new functions for a Service or changes made
   for legal reasons will be effective immediately. If you do not agree to
   the modified terms for a Service, you should discontinue your use of that
   Service.

   If there is a conflict between these terms and the additional terms, the
   additional terms will control for that conflict.

   These terms control the relationship between Google and you. They do not
   create any third party beneficiary rights.

   If you do not comply with these terms, and we don’t take action right
   away, this doesn’t mean that we are giving up any rights that we may have
   (such as taking action in the future).

   If it turns out that a particular term is not enforceable, this will not
   affect any other terms.

   The laws of California, U.S.A., excluding California’s conflict of laws
   rules, will apply to any disputes arising out of or relating to these
   terms or the Services. All claims arising out of or relating to these
   terms or the Services will be litigated exclusively in the federal or
   state courts of Santa Clara County, California, USA, and you and Google
   consent to personal jurisdiction in those courts.

   For information about how to contact Google, please visit our [10]contact
   page.

  Good to Know

     * Our Good to Know site helps you stay safe and protect your family’s
       information online. [11]Visit to learn more

  Our legal policies

     * [12]Privacy Policy
     * Terms of Service
     * [13]FAQ

  Some technical details

     * [14]Technologies and Principles
     * [15]Advertising
     * [16]How Google uses cookies
     * [17]How Google uses pattern recognition
     * [18]Types of location data used by Google
     * [19]How Google Wallet uses credit card numbers
     * [20]How Google Voice works

   Change language: [[21]________________________]

     * [22]Google
     * [23]About Google
     * [24]Privacy & Terms

References

   Visible links
   1. http://www.google.com/
   2. http://www.google.com/intl/en/policies/
   3. http://www.google.com/intl/en/policies/terms/#content
   4. http://www.google.com/intl/en/policies/
   5. http://www.google.com/intl/en/policies/terms/archive/
   6. http://www.google.com/intl/en/policies/terms/archive/
   7. http://support.google.com/accounts/bin/answer.py?hl=en&answer=58585
   8. http://www.google.com/intl/en/policies/privacy/
   9. http://support.google.com/bin/static.py?hl=en&ts=1114905&page=ts.cs
  10. http://www.google.com/intl/en/contact/
  11. http://www.google.com/intl/en/goodtoknow/
  12. http://www.google.com/intl/en/policies/privacy/
  13. http://www.google.com/intl/en/policies/faq/
  14. http://www.google.com/intl/en/policies/technologies/
  15. http://www.google.com/intl/en/policies/technologies/ads/
  16. http://www.google.com/intl/en/policies/technologies/cookies/
  17. http://www.google.com/intl/en/policies/technologies/pattern-recognition/
  18. http://www.google.com/intl/en/policies/technologies/location-data/
  19. http://www.google.com/intl/en/policies/technologies/wallet/
  20. http://www.google.com/intl/en/policies/technologies/voice/
  22. http://www.google.com/
  23. http://www.google.com/intl/en/about/
  24. http://www.google.com/intl/en/policies/
