Before you begin
Make sure you have:- A Vanta account with the Admin role. Creating applications in Settings → Developer Console is limited to Admins. If you can’t see the Developer Console, ask an Admin in your Vanta organization.
- A terminal or HTTP client (cURL, Postman, or your language of choice).
Building an integration for multiple Vanta organizations? Private integrations are single-tenant and use the simpler
client_credentials grant. If you want other Vanta organizations to install your integration, follow the Build a Public Integration quickstart instead.Create a Private Integration
Vanta Dashboard — sign in to the Vanta app, open Settings → Developer Console, and click Create.Choose Build Integrations as the app type, then select Private for the distribution. Fill in:
-
Application name —
Demo Private Integration(or enter a name of your choosing). -
Application description —
Vanta quickstart demo integration
client_id is auto-generated. Click Generate client secret to create the secret. Store both values securely. You can rotate the secret at any time without invalidating data you’ve already pushed.Get an access token
From your terminal, exchange your client credentials for an access token. This quickstart requests two scopes: Expected response:
connectors.self:write-resource to push data and connectors.self:read-resource to read it back for verification.One token at a time. Vanta only allows one active access token per application — requesting a new token immediately revokes the previous one. Tokens expire after one hour, so most integrations request a fresh token at the top of each sync run.
Got a 401 or invalid_client?
Got a 401 or invalid_client?
Double-check the
client_id and client_secret from the Developer Console. If you rotated the secret, the old one is no longer valid. Make sure your Content-Type header is application/json — Vanta’s /oauth/token does not accept form-encoded bodies.Got an invalid_scope error?
Got an invalid_scope error?
You requested a scope that isn’t available to Build Integrations apps. Private integrations can request
connectors.self:write-resource, connectors.self:read-resource, self:write-document, and self:read-document. Request only what your tool needs.Push your first resource
Most private integrations start with Expected response (
UserAccount — Vanta’s representation of a person in an external system, used for access reviews. PUT is idempotent on uniqueId, so it’s safe to retry on network errors.-
Vanta Dashboard — in your private app’s Resources tab, click Add resource, choose the User Account base type, save, and copy the generated
Resource ID. EveryPUTreferences this ID so Vanta knows which resource configuration the records belong to.
-
Terminal — replace
your_token_herewith theaccess_tokenfrom Step 2 andyour_resource_idwith theResource IDyou just copied, then push a record:
200 OK):Sync custom resources
Use a custom resource to define your own schema and push data Vanta doesn’t model out of the box — homegrown app objects, on-prem servers, internal review records, and the like.
-
Vanta Dashboard — open your private app’s Resources tab and create a new resource using the Custom Resource base type. Give it a name (e.g.
Internal Server) and define the custom fields you want to sync to Vanta using JSON Type Definition.Save and copy the generatedResource ID— you’ll reference it on every push. -
Terminal — push records to the custom-resource endpoint. Replace
your_token_herewith youraccess_tokenandyour_custom_resource_idwith theResource IDyou just copied. Each record includes the base fields (displayName,uniqueId,externalUrl) at the top level and your schema fields nested insidecustomProperties.
Custom resources don’t have built-in compliance tests — Vanta doesn’t know what “compliant” means for your schema yet. Step 5 walks through authoring a Custom Test to define that pass/fail logic.
Got resourceId not found?
Got resourceId not found?
The
resourceId in your PUT body must match the ID Vanta generated when you created the custom resource in the Dashboard. Open the resource definition in the Resources tab and copy the ID exactly — it’s case-sensitive.Verify it worked
From your terminal, read back the resource you pushed in Step 3 to confirm you completed everything correctly.Then open the Vanta app:
Terminal
- Navigate to the Access page. The user you
PUTshould appear with the samedisplayNameandemail. - Open Tests → Custom, find the test you authored in Step 5, and confirm it shows the pass/fail outcome you expected for each record.
Congratulations
You have a working private integration — authenticating withclient_credentials, pushing both built-in and custom resources into your own Vanta tenant, and evaluating that data against compliance criteria you define via Custom Tests. From here you can:
- Schedule it. Run the sync hourly from cron, a Lambda, or your CI runner. Always request a fresh token at the start of the run.
- Expand resource coverage. Push additional supported types (
Computer,Vulnerability,BackgroundCheck,TrainingRecord, etc.) from the same app. - Add more Custom Tests. Layer additional pass/fail rules on the same custom resource, or copy an existing test to create a variant for a different scope.
- Map tests to frameworks. Wire each Custom Test to the controls it satisfies so failing resources surface as gaps in SOC 2, ISO 27001, HIPAA, and any other framework you’re tracking.
Next steps
Supported resource types
Full reference of every resource type Vanta accepts out of the box.
Create a custom resource
Deep dive on defining a custom schema and pushing records.
Author a Custom Test
Turn the data you sync into compliance evidence with pass/fail logic.
Build Integrations API reference
Every endpoint available to Build Integrations apps.
