# Creating an 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.