Accela Authentication API (OAuth 2.0)

The Construct authorization server. Three operations — POST /oauth2/authorize (authorization code), POST /oauth2/token (authorization code, implicit and password-credential grants) and GET /oauth2/tokeninfo — issue and validate agency- and citizen-app access tokens bound to an agency, an environment and a set of Construct permission scopes.

Operations 3

POST /oauth2/authorize Get Authorization Code #
POST /oauth2/token Get Access Token #
GET /oauth2/tokeninfo Get Token Info #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/accela-authentication-api-oauth-20"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

accela-authentication-openapi.yml Raw ↑
basePath: /
schemes:
- https
swagger: '2.0'
host: auth.accela.com
info:
  description: Accela OAuth2 API for generating API access tokens. For an overview, see [Accela API Authentication](../construct-apiAuth.html).
  title: Authentication
  version: v4
paths:
  /oauth2/authorize:
    post:
      description: "Gets an authorization code (for authorization code flow) or access token (for implicit flow) from the\
        \ authentication server.\n\nThis API is used for the following:\r\n\t\t\t\t\n\n- [Authorization Code Flow](../construct-authCodeFlow.html)\
        \ - set the request parameter response_type=code. If successful, the authorization code will be returned in the response\
        \ body. Use the authorization code to get the access token from [Get Access Token](#operation/oauth2.token).\r\n\t\
        \t\t\t\n\n- [Implicit Flow](../construct-implicitFlow.html) - set the request parameter response_type=token. If successful,\
        \ the access token will be returned in the access_token parameter in the redirect URL.   \r\n\t\t\t\t\n\n**Note**:\
        \ You can invoke this API using the HTTP GET method. In which case, specify the described request body fields as request\
        \ query parameters.\n\n\n\n**API Endpoint**:  POST /oauth2/authorize"
      summary: Get Authorization Code
      operationId: oauth2.authorize
      parameters:
      - description: Request authorization parameters
        in: body
        name: authRequest
        required: true
        schema:
          $ref: '#/definitions/request_authorize'
      responses:
        '200':
          description: "Successful response. \n\nFor authorization code flow request where response_type=code), the authorization\
            \ code is returned in the response body. \n\nFor an implicit flow request where response_type=token, the access\
            \ token will be returned in the access_token parameter in the redirect URL. "
          schema:
            $ref: '#/definitions/response_authorize'
        '400':
          description: Invalid request.
          schema:
            $ref: '#/definitions/response_error'
        '401':
          description: Authorization failed.
          schema:
            $ref: '#/definitions/response_error'
        '403':
          description: Forbidden request.
          schema:
            $ref: '#/definitions/response_error'
        '404':
          description: Requested resource not found.
          schema:
            $ref: '#/definitions/response_error'
        '500':
          description: Internal server error or bad connection.
          schema:
            $ref: '#/definitions/response_error'
  /oauth2/token:
    post:
      description: "Gets an access token from the authentication server.\n\n\r\n\t\t\t\t\n\nThis API is used for the following:\r\
        \n\n\n- [Authorization Code Flow](../construct-authCodeFlow.html) - set the request parameter grant_type=authorization_code.\
        \ \r\n\n\n- [Password Credential Login](../construct-passwordCredentialLogin.html) - set the request parameter grant_type=password.\
        \  \r\n\n\n- Refreshing the token - set the request parameter grant_type=refresh_token. Access tokens have a limited\
        \ lifetime and, in some cases, an application needs access to an API beyond the lifetime of a single access token.\
        \ When this is the case, your application can obtain a new access token using the refresh token. Your app can refresh\
        \ the token before it expires or when it expires, according your app requirements or workflow.\n\n\n\n**API Endpoint**:\
        \  POST /oauth2/token"
      summary: Get Access Token
      operationId: oauth2.token
      parameters:
      - description: Must be application/x-www-form-urlencoded.
        in: header
        name: Content-Type
        required: true
        type: string
      - description: Your app id.
        in: header
        name: x-accela-appid
        required: true
        type: string
      - description: Request token parameters
        in: body
        name: tokenRequest
        required: true
        schema:
          $ref: '#/definitions/request_token'
      responses:
        '200':
          description: Successful request.
          schema:
            $ref: '#/definitions/response_token'
        '400':
          description: Invalid request.
          schema:
            $ref: '#/definitions/response_error'
        '401':
          description: Authorization failed.
          schema:
            $ref: '#/definitions/response_error'
        '403':
          description: Forbidden request.
          schema:
            $ref: '#/definitions/response_error'
        '404':
          description: Requested resource not found.
          schema:
            $ref: '#/definitions/response_error'
        '500':
          description: Internal server error or bad connection.
          schema:
            $ref: '#/definitions/response_error'
  /oauth2/tokeninfo:
    get:
      description: 'Validates a given access token in the *Authorization* http header, and returns the token information.
        Use the token information to match it with the information used to request the access token.




        **API Endpoint**:  GET /oauth2/tokeninfo'
      summary: Get Token Info
      operationId: oauth2.tokeninfo
      parameters:
      - description: The access token to validate.
        in: header
        name: Authorization
        required: true
        type: string
      responses:
        '200':
          description: 'Successful request. '
          schema:
            $ref: '#/definitions/response_tokeninfo'
        '400':
          description: Invalid request.
          schema:
            $ref: '#/definitions/response_status'
        '401':
          description: Authorization failed.
          schema:
            $ref: '#/definitions/response_status'
        '403':
          description: Forbidden request.
          schema:
            $ref: '#/definitions/response_status'
        '404':
          description: Requested resource not found.
          schema:
            $ref: '#/definitions/response_status'
        '500':
          description: Internal server error or bad connection.
          schema:
            $ref: '#/definitions/response_status'
definitions:
  request_authorize:
    type: object
    required:
    - response_type
    - client_id
    - redirect_uri
    - agency_name
    - environment
    properties:
      response_type:
        description: "Specifies whether the request is for an authorization code or access token. \r\n\t\t\t\t\t\n\nValid\
          \ values:\r\n\t\t\t\t\t\n\n*code* - Request for an authorization code. See [Authorization Code Flow](../construct-authCodeFlow.html).\r\
          \n\t\t\t\t\t\n\n*token* - Request for an access token. See [Implicit Flow](../construct-implicitFlow.html)."
        enum:
        - code
        - token
        type: string
      client_id:
        description: The app ID value from [Construct Developer Portal](https://developer.accela.com).
        type: string
      redirect_uri:
        description: "The URI that is used to redirect to the client with an authorization code. This must be a valid URL.\r\
          \n\t\t\t\t\t\n\n**Note**: Special characters in the URL should be encoded."
        type: string
      environment:
        description: The Construct environment name, such as "PROD" and "TEST". The [Get All Agency Environments](./api-agencies.html#operation/v4.get.agencies.name.environments)
          API returns a list of configured environments available for a specific agency. The [Get Environment Status](./api-agencies.html#operation/v4.get.agencies.name.environments.env.status)
          checks connectivity with the Agency/Environment.
        type: string
      agency_name:
        description: "The agency name defined in [Construct Administrator Portal](https://admin.accela.com). APIs such as\
          \ [Get All Agencies](./api-agencies.html#operation/v4.get.agencies), [Get Agency](./api-agencies.html#operation/v4.get.agencies.name),\
          \ and [Search Agencies](./api-search.html#operation/v4.post.search.agencies) return valid agency names. \r\n\t\t\
          \t\t\t\n\n**Note**: For an **agency app**, agency is required.\nFor a **citizen app** that use dynamic agency routing\
          \ functionality, agency_name is optional."
        type: string
      forcelogin:
        description: "Indicates whether or not Accela Auth server forces end-user login each time client requests access token.\
          \ \t\t\t\t\t\r\n\t\t\t\t\t\n\nValid values:\r\n\n\n*true*: Always force end-user login.\r\n\n\n*false*: Do not force\
          \ end-user login. The sever determines if the current request needs login. This is the default behavior."
        type: boolean
      scope:
        description: The scope of the resources that the client requests. Enter a list of APIs scope names separated by spaces.
          Get the scope names from the [Accela API Reference](./api-index.html).
        type: string
      state:
        description: An opaque value that the client uses for maintaining the state between the request and callback. Enter
          a unique value. This can be used for [Cross-Site Request Forgery](http://en.wikipedia.org/wiki/Cross-site_request_forgery)
          (CSRF) protection.
        type: string
  response_authorize:
    type: object
    properties:
      code:
        type: string
        description: The authorization code (for an authorization code flow request where response_type=code). The client
          app uses the authorization code to exchange for an access token.
      environment:
        type: string
        description: "The environment name that the user selected when signing into the app (for an authorization code flow\
          \ request where response_type=code). \r\n\t\t\t\t\t\n\nFor an implicit flow request where response_type=token, environment\
          \ is returned as a parameter in the redirection URI using the \"application/x-www-form-urlencoded\" format. "
      agency_name:
        type: string
        description: "The agency name that the user entered when signing into the app (for an authorization code flow request\
          \ where response_type=code). \r\n\t\t\t\t\t\n\nFor an implicit flow request where response_type=token, agency_name\
          \ is returned as a parameter in the redirection URI using the \"application/x-www-form-urlencoded\" format. "
      state:
        type: string
        description: "The exact value received from the client (for an authorization code flow request where response_type=code).\
          \ Check this value against original state value sent in the request to verify and protect against CSRF. \n\nFor\
          \ an implicit flow request where response_type=token, state is returned as a parameter in the redirection URI using\
          \ the \"application/x-www-form-urlencoded\" format. "
      access_token:
        type: string
        description: 'The issued user access token (for an implicit flow request where response_type=token). access_token
          is returned as a parameter in the redirection URI using the "application/x-www-form-urlencoded" format. '
      token_type:
        type: string
        description: 'The type of the token issued (for an implicit flow request where response_type=token). token_type is
          returned as a parameter in the redirection URI using the "application/x-www-form-urlencoded" format. '
      expires_in:
        type: string
        description: 'The lifetime in seconds of the access token (for an implicit flow request where response_type=token).
          For example, the value "3600" denotes that the access token will expire in one hour from the time the response was
          generated. expires_in is returned as a parameter in the redirection URI using the "application/x-www-form-urlencoded"
          format. '
      scope:
        type: string
        description: 'The scope of the resources authenticated by the authorization server (for an implicit flow request where
          response_type=token). scope is returned as a parameter in the redirection URI using the "application/x-www-form-urlencoded"
          format. '
  request_token:
    type: object
    required:
    - client_id
    - client_secret
    - grant_type
    - redirect_uri
    - code
    - username
    - password
    - agency_name
    - environment
    properties:
      client_id:
        description: The app ID value from [Construct Developer Portal](https://developer.accela.com).
        type: string
      client_secret:
        description: The app secret value from [Construct Developer Portal](https://developer.accela.com).
        type: string
      grant_type:
        description: "Specifies whether the request is for an authorization code, password credential access token, or refresh\
          \ token. Valid values:\r\n\t\t\t\t\t\n\nValues:\r\n\t\t\t\t\t\n\nauthorization_code - Request to exchange the given\
          \ authorization code with an access token. Used with [Authorization Code Flow](../construct-authCodeFlow.html).\
          \ \r\n\t\t\t\t\t\n\npassword - Request authentication via userid and password credential. See [Password Credential\
          \ Login](../construct-passwordCredentialLogin.html). \r\n\t\t\t\t\t\n\nrefresh_token - Request to refresh the token.\
          \ \r\n\t\t\t\t\t\n\n**Note**: Make sure the grant_type value does not contain any space character."
        enum:
        - authorization_code
        - password
        - refresh_token
        type: string
      code:
        description: "The authorization code obtained from the preceding [/oauth2/authorize](#operation/oauth2.authorize)\
          \ request.\r\n\t\t\t\t\t\n\n**Note**: code is required only when calling this API with grant_type=authorization_code\
          \ for [Authorization Code Flow](../construct-authCodeFlow.html). \r\n\t\t\t\t\t\n\n**Note**: The code should be\
          \ URL-encoded, if you are using tools or libraries which will auto-encode the code, you need to pass the code under\
          \ decoded.\r\n\t\t\t\t\t\n\n**Note**: The code can be used no more than one time, the client should apply the rule\
          \ during exchange access token."
        type: string
      redirect_uri:
        description: "The URI that is used to redirect to the client with an access token.\r\n\t\t\t\t\t\n\n**Note**: redirect_uri\
          \ is required only when calling this API with grant_type=authorization_code for [Authorization Code Flow](../construct-authCodeFlow.html).\
          \ \r\n\t\t\t\t\t\n\n**Note**: The value of redirect_uri must match the redirect_uri used in the preceding [/oauth2/authorize](#operation/oauth2.authorize)\
          \ request."
        type: string
      username:
        description: "For a **citizen app**, the user name is the Civic ID.\nFor an **agency app**, the user name is the Civic\
          \ Platform account.\r\n\t\t\t\t\t\n\n**Note**: username is required only when calling this API with grant_type=password\
          \ for [Password Credential Login](../construct-passwordCredentialLogin.html). "
        type: string
      password:
        description: "For a **citizen app**, the user name is the Civic ID password.\nFor an **agency app**, the user name\
          \ is the Civic Platform password.\r\n\t\t\t\t\t\n\n**Note**: username is required only when calling this API with\
          \ grant_type=password for [Password Credential Login](../construct-passwordCredentialLogin.html). "
        type: string
      scope:
        description: "The scope of the resources that the client requests. Enter a list of APIs scope names separated by spaces.\
          \ Get the scope names from the [Accela API Reference](./api-index.html).\r\n\t\t\t\t\t\n\n**Note**: scope is required\
          \ only when calling this API with grant_type=password for [Password Credential Login](../construct-passwordCredentialLogin.html). "
        type: string
      agency_name:
        description: "The agency name defined in [Construct Administrator Portal](https://admin.accela.com). APIs such as\
          \ [Get All Agencies](./api-agencies.html#operation/v4.get.agencies), [Get Agency](./api-agencies.html#operation/v4.get.agencies.name),\
          \ and [Search Agencies](./api-search.html#operation/v4.post.search.agencies) return valid agency names. \r\n\t\t\
          \t\t\t\n\n**Note**: agency_name is used only when calling this API with grant_type=password for [Password Credential\
          \ Login](../construct-passwordCredentialLogin.html). For an **agency app**, agency_name is required.\nFor a **citizen\
          \ app**, agency_name is optional."
        type: string
      environment:
        description: "The Construct environment name, such as \"PROD\" and \"TEST\". The [Get All Agency Environments](./api-agencies.html#operation/v4.get.agencies.name.environments)\
          \ API returns a list of configured environments available for a specific agency. The [Get Environment Status](./api-agencies.html#operation/v4.get.agencies.name.environments.env.status)\
          \ checks connectivity with the Agency/Environment..\r\n\t\t\t\t\t\n\n**Note**: scope is required only when calling\
          \ this API with grant_type=password for [Password Credential Login](../construct-passwordCredentialLogin.html). "
        type: string
      refresh_token:
        description: "The refresh token value obtained in the prior access token API request.\r\n\t\t\t\t\t\n\n**Note**: refresh_token\
          \ is required only when calling this API to refresh the token for both [Authorization Code Flow](../construct-authCodeFlow.html)\
          \ and [Password Credential Login](../construct-passwordCredentialLogin.html). "
        type: string
      state:
        description: "An opaque value that the client uses for maintaining the state between the request and callback. Enter\
          \ a unique value. This can be used for [Cross-Site Request Forgery](http://en.wikipedia.org/wiki/Cross-site_request_forgery)\
          \ (CSRF) protection.\n\nThis parameter is not used when refreshing a token.\r\n\t\t\t\t\t\n\n**Note**: state is\
          \ used and optional only when calling this API with grant_type=authorization_code for [Authorization Code Flow](../construct-authCodeFlow.html). "
        type: string
  response_token:
    type: object
    properties:
      access_token:
        type: string
        description: The issued user access token.
      token_type:
        type: string
        description: The type of the token issued. It contains the fixed value "bearer" for authorization_code grant type.
      expires_in:
        type: string
        description: The lifetime in seconds of the access token. For example, the value "3600" denotes that the access token
          will expire in one hour from the time the response was generated.
      refresh_token:
        type: string
        description: The refresh token that can be used to obtain a new access token.
      scope:
        type: string
        description: The scope of the resources authenticated by the authorization server.
      state:
        type: string
        description: 'The exact value received from the client. '
  response_tokeninfo:
    type: object
    properties:
      appId:
        type: string
        description: The app ID value from [Construct Developer Portal](https://developer.accela.com). This value is passed
          in your access token request.
      userId:
        type: string
        description: The logged in user's unique id.
      agencyName:
        type: string
        description: 'The agency name defined in the Accela Administrator Portal. The agency name is passed by client request
          or chosen by the end-user during access token request flow. '
      scopes:
        items:
          description: A scope the request has access to.
          type: string
        type: array
      expiresIn:
        type: integer
        description: The lifetime in seconds of the access token.
      state:
        type: string
        description: 'The exact value received from the client. '
  response_status:
    type: object
    properties:
      status:
        type: string
        description: The HTTP error code.
      code:
        type: string
        description: The error code.
      message:
        type: string
        description: The error message.
      traceId:
        type: string
        description: 'The traceid for debugging purposes. '
  response_error:
    type: object
    properties:
      error:
        type: string
        description: The error code. Refer [here](https://tools.ietf.org/html/rfc6749#section-4.1.2) for details.
      error_description:
        type: string
        description: The error description text.
      error_uri:
        type: string
        description: The URI of web page with more information about the error.
      state:
        type: string
        description: 'The exact value received from the client. '
x-api-evangelist-provenance:
  generated: '2026-09-06'
  method: searched
  source: https://developer.accela.com/api/v4/api-auth.json
  note: Harvested verbatim from the Accela Developer Portal API Reference, which renders these Swagger 2.0 documents via ReDoc
    (spec-url on developer.accela.com/docs/api_reference/api-*.html). The byte-identical original is kept at openapi/_original/.
    This copy is the same document serialized to YAML.
  repairs:
  - removed trailing commas
  - The published JSON did not parse as strict JSON; only syntax was repaired, no content was added or changed.