Instant Games FAQ

Developing an Instant Game

If you can't see "Instant Games" in the list when selecting "Add Product" to your application, make sure that your app is in the "Games" category. The "Instant Games" product will not show up for apps outside of this category.

We don't impose hard limits on game size. But we do recommend that the initial download size not exceed 5 seconds. You can host up game bundles of up until 200MB but you should only download absolutely necessary files in the initial load. For more information please refer to our Best Practices section

Our FBInstant.context.shareAsync() method contains an intent parameter that accepts values like 'INVITE', 'SHARE', etc. Currently, as of version 4.0, this parameter does not serve a specific purpose. It was added to future-proof the SDK and its will provide user-facing changes in the future, but for the moment, it only provides semantic value.

This is currently not possible. When you are challenging another player in the thread for the first time, there's no SDK method to retrieve information about the person being challenged. We recommend to use a placeholder name like "opponent" until the second player responds to the invite, when you'll be able to access their information via FBinstant.player.

When it comes to deciding where to store your information, there are two options:

  1. Having a third-party backend that your game communicates with via XMLHttpRequest, fetch, WebSocket or EventSource. This will mean more flexibility but will also incur hosting costs that are proportional to your game's audience.
  2. Using our SDK-based solutions that enable many server-side functionality out of the box: a. For storing player-specific information, use our player.getDataASync and player.setDataAsync methods b. For leaderboards, see our Leaderboard API guide

The minimum system requirements for playing instant games are:

  • iOS 8 and above
  • Android 5.0 and above

Consult our lightweight games documentation to get more details about the minimum requirements for lightweight games.

To restrict the access to your game to a custom list of countries:

  1. On the dashboard of the application, go to Settings / Advanced
  2. Enable "Country Restricted"
  3. Select countries from the "Allowed Countries" selector
  4. Click on "Save Changes"

During submission for Instant Game app review, you must provide an Apple Developer team ID in accordance with Apple's App Store Review Guidelines 4.7. This enables distribution of your game on iOS. Using an invalid or expired Developer team ID may lead to your game being removed.

You can find your team ID by logging into your Apple Developer Account.

You can report issues directly on Howler.js Github. Put "[IG]" in the title of the issue to help the developers prioritize.

You should make sure to call window.innerWidth and window.innerHeight after FBInstant.startGameAsync() resolves.

You can use (and even edit) tracks from Facebook's Sound Collection in your games. Do note that Sound Collection content can only be used on the Facebook platform, so any version of your game that incorporates Sound Collection content can only be distributed/used on our platform.

Developer game submissions and launches are limited to one per week. We created this limit to help you, as a developer, be successful as you launch your game.

You can submit and publish two games over the course of two weeks. One game can be reviewed by Facebook per week, and one game can be published per week, once it has been reviewed and approved.

To learn more about the review process, see the Submitting for Review section in the Launch Checklist.

Game bots

The most common cause for a bot not receiving webhooks is misconfiguration in the app. Please visit our Bot Setup section for a full guide on how to setup your game bot. Check your developer dashboard for the following:

  1. You need to have an App Page configured in the Instant Games section of the developer dashboard
  2. You need to have subscribed to the messages and messaging_game_plays events in the Messenger section of the developer dashboard
  3. You need to have the same page as step (1) above configured in the "subscribed pages" panel, in the Messenger section of the developer dashboard
  4. Your page needs to be of category "App Page" and needs to have a name that contains your game name.

If you're getting errors as response to the Graph API send calls, it means that one of the following situations is happening:

  • You're trying to send messages outside of the per-user limit of 5 messages over 10 days; or
  • You're trying to send messages to a user who has deleted, blocked or muted your bot; or
  • Your app is in Development Mode and you're trying to send messages to people who don't have an Admin or Developer role in the app

For more information please refer to the Send API documentation

Common issues and troubleshooting

If you're following either of our [Quickstart] or our [Test, Publish, Share] guides you must be familiar with our concept of the Embedded player. It's a way for you to test your Instant Game running from a local HTTP service in your computer, linked to all live functions of the Instant Games SDK.

Sometimes when you try this approach, your game can be stuck in the loading. Sometimes no message will be displayed in the browser's developer console, and some other times a message will be displayed saying Failed to execute 'postMessage' on 'DOMWindow'. These are both manifestations of the same type of error, most commonly caused by your local server is refusing to serve assets because of a certificate issue.

If that's the case, navigate to the root of your local server (usually https://localhost:8000 or and follow your browser's instructions in accepting certificates, or adding a security exception for this website. Once you've done that, go back to the Embedded player URL and everything should be working.

This error happens when you are trying to load an ad from an AdInstance which has failed in the past. If your AdInstance's loadAsync method has rejected once already, don't try to reuse it. Instead, request a new AdInstance by calling getInterstitialAsync or getRewardedVideoAsync