# Creating a Usergrid Account
To get started using the Usergrid, you'll need an Usergrid account. (Before reading this, you should already be familiar with what Usergrid can do to support your apps. If you're still curious about that, you might want to read Usergrid features first.)

With an account, you get the following useful things:

* A sandbox application you can try things with (we automatically create one for you with your new account). The sandbox is a partitioned area of the data store where you can add example data and try out API calls. The sandbox isn't secure, but it's handy to play in. For more about the sandbox, see [Using Your Application Sandbox](../getting-started/using-a-sandbox-app.html).
* The ability to create more applications (in addition to the sandbox). You can (and should!) make these as secure as you need to. These are the applications that you'll have behind the apps you make available to your users.
* Access to the Admin Portal. In the portal, you can do the following:
    * Create and manage applications.
    * Manage your app's users, including access levels.
    * Manage the data in your app.
    * Manage app features, including push notifications, activities, analytics, and so on.
    * Try out API calls with a shell command window.
    * To create an Usergrid account and see a very short tutorial to get started with, go to the get started page of the Portal.

## Next steps
Ready to learn and do more?

* Install an SDK that will be most useful for your application environment. For more about Usergrid's SDKs, see [SDKs](../sdks/tbd.html).
* Review Usergrid features for information on concepts and features.
* Consult the API Reference for usage details.