Skip to main content
Use this API spec to build your custom connector after you’ve generated boilerplate code following the steps in Create your own connector. You can also reference the Datadog custom connector as you build your implementation.

Endpoints

GET /status

Checks the status of the connector. This endpoint is mainly used for successfully creating the app in Opal and verifying that the connector is properly configured. Query params Response params (200) No body is required in the response for status code 200. Response params (Error)

GET /resources

Returns a list of all resources for the app in question. This endpoint is called after you’ve imported resources to the app, so you may not see it being called when you first create your app. To distinguish resources pulled from multiple sources, you can include the type in the identifier, then base64-encode the ID so it can be properly parsed—e.g., base64(resource-type:1). Query params Response params (200) Response params (Error) Resource object Example response

GET /resources/{resource_id}

Get a specific resource by its ID. Path params Query params Response params (200) Resource object Response params (Error) Example response

GET /resources/{resource_id}/access_levels

If your resource doesn’t require any access level, this endpoint can return "access_levels": [].
Returns all available access levels for a resource, paginated. Access levels are exposed in the Opal dashboard and to end users as roles, which users select when they request access to the resource. Path params Query params Response params (200) Response params (Error) Access level object Example response

GET /resources/{resource_id}/users

Returns the users that currently have access to the provided resource. Path params Query params Response params (200) Response params (Error) ResourceUser object Example response

POST /resources/{resource_id}/users

Adds a user to the access list of the specified resource. Path params Body params (JSON encoded) Example request
Response params (200) No body is required as part of this endpoint for status code 200. Response params (Error)

DELETE /resources/{resource_id}/users/{user_id}

Remove a user from the access list of the specified resource. Path params Query params Response params (200) No body is required as part of this endpoint for status code 200. Response params (Error)

GET /groups

Returns a list of all groups for the app in question. The /groups endpoints are only called if Connector Groups is enabled in the custom app form. Query params Response params (200) Response params (Error) Group object Example response

GET /groups/{group_id}

Get a specific group by its id. Path params Query params Response params (200) Group object Response params (Error) Example response

GET /groups/{group_id}/users

Returns the users that currently belong to the provided group. Path params Query params Response params (200) Response params (Error) GroupUser object Example response

POST /groups/{group_id}/users

Adds a user to the access list of the specified group. Path params Body params (JSON encoded) Example request
Response params (200) No body is required as part of this endpoint for status code 200. Response params (Error)

DELETE /groups/{group_id}/users/{user_id}

Remove a user from the access list of the specified group. Path params Query params Response params (200) No body is required as part of this endpoint for status code 200. Response params (Error)

GET /groups/{group_id}/resources

Returns the resources that currently belong to the provided group. Path params Query params Response params (200) Response params (Error) GroupResource object Example response

POST /groups/{group_id}/resources

Adds a resource to the access list of the specified group. Path params Body params (JSON encoded) Example request
Response params (200) No body is required as part of this endpoint for status code 200. Response params (Error)

DELETE /groups/{group_id}/resources/{resource_id}

Remove a resource from the access list of the specified group. Path params Query params Response params (200) No body is required as part of this endpoint for status code 200. Response params (Error)

GET /groups/{group_id}/member-groups

Returns member groups for the specified group. Required if you enable Nested Groups when you create the custom app. Path params Query params Response params (200) Response params (Error) Member group object

POST /groups/{group_id}/member-groups

Add a member group to the specified group. Required if you enable Nested Groups when you create the custom app. Path params Body params (JSON encoded) Example request
Response params (200) No body is required as part of this endpoint for status code 200. Response params (Error)

GET /users

Returns a list of users for your custom connector app. Query params Response params (200) Response params (Error) User object Example

POST /users

This endpoint enables users to be provisioned into a custom connector app. This functionality is only available if user provisioning has been enabled for the connection. Body params (JSON encoded) UserAttributes object UserTag object Response params (200) Response params (Error)

DELETE /users/{user_id}

This endpoint deprovisions user accounts in a custom connector application. This functionality is only available if user deprovisioning has been enabled for the connection. Path params UserAttributes object UserTag object Query params Response params (200) No body is required as part of this endpoint for status code 200. Response params (Error)

GET /events

This endpoint is only called if Connector Event Ingestion is enabled in the custom app form. Query params Response params (200) Response params (Error) Event object ActorUserIdentifier object EventContentLoginSuccess object Example

Error codes

All error codes need to implement the following object: In addition, you can distinguish the type of error and meaning by following these codes All 429 and 500 errors will be retried up to 4 times with linear backoff, with 1 second between retries.

Rate Limiting

Opal will respect your custom connector’s rate limits if you choose to implement them. If you return a 429 status code, Opal will back off and retry the request up to 4 times. By default, Opal will retry after 1 second. To control when Opal retries, you can include a Retry-After header:
Where <seconds> is the number of seconds Opal should wait before retrying the request.

Signature

To ensure that the API calls originate from Opal, we provide a header in each request that represents the encrypted request payload with a secret that is generated when creating the app connector in Opal. See Setup connector app in Opal for more details. On each HTTP request that Opal sends, we add an X-Opal-Signature HTTP header. The signature is created by combining the signing secret with the body of the request we’re sending using a standard HMAC-SHA256 keyed hash. Here is an example with Node to compute the signature using your signing secret. You may compare it against the value retrieved from the X-Opal-Signature header:
Note: when the body is empty, do coalesce the empty/null stringified body to {}. See the link below for more examples. Check Create your own connector for signature examples.
Last modified on June 12, 2026