Skip to content
Last updated

This page covers the core concepts you need before building an integration: authentication, response format, and rate limits.

Base URL

All API requests use this base URL:

https://api.forms.app

Authentication

Every request must be authenticated with exactly one of the two methods below. Sending both in the same request returns 401 Unauthorized.

Option 1: API key

Pass your API key in the X-Api-Key header:

X-Api-Key: <your_api_key>

This is the simplest option for server-to-server integrations. See Quick start for how to create a key.

Option 2: OAuth 2.0 bearer token

Obtain a JWT through the forms.app OAuth 2.0 flow and pass it in the Authorization header:

Authorization: Bearer <your_token>

Use OAuth when your integration acts on behalf of a user through a third-party app.

Use one method per request

Never send both X-Api-Key and Authorization: Bearer in the same request. The API rejects the call with 401 Unauthorized.

Response envelope

All endpoints return a consistent JSON envelope.

Success (2xx)

{
  "success": true,
  "data": { },
  "errors": []
}

The data field holds the endpoint payload, an array, object, or paginated result depending on the route.

Error (4xx / 5xx)

{
  "success": false,
  "data": null,
  "errors": [
    {
      "errorCode": 1001,
      "errorMessage": "Unauthorized"
    }
  ]
}

Each entry in errors includes:

FieldDescription
errorCodeMachine-readable code identifying the failure
errorMessageHuman-readable description

Always check success before reading data. When success is false, inspect errors for details.

Common HTTP status codes

StatusMeaning
200Request succeeded
400Bad request, check your parameters
401Unauthorized, missing or invalid credentials, or both auth methods supplied
404Not found, the form does not exist or belongs to another account
429Too many requests, rate limit exceeded
500Internal server error

Rate limiting

Requests are rate-limited per API key or token. When you exceed the limit, the API returns 429 Too Many Requests.

If you receive a 429:

  1. Wait briefly before retrying.
  2. Avoid tight retry loops, space out requests or use exponential backoff.
  3. Cache form structure when possible instead of re-fetching on every sync.

Read-only access

The API provides read-only access to your forms and submissions. You can:

  • List forms in your account
  • Fetch a form's full structure (questions, design, settings)
  • Page through submitted answers

You cannot create, update, or delete forms or submissions through the API.

What's next?