Skip to main content
The FGA module is deprecated. Please use the Authorization API instead for all new implementations.
The Fine-Grained Authorization (FGA) API provides a flexible authorization system based on relationship-based access control (ReBAC). This API is deprecated and maintained for backward compatibility only.

Initialize

import { WorkOS } from '@workos-inc/node';

const workos = new WorkOS('sk_example_123456789');

Methods

check

Check if a subject has a specific relation to a resource.
const result = await workos.fga.check({
  checks: [
    {
      resource: { resourceType: 'document', resourceId: 'doc_123' },
      relation: 'viewer',
      subject: { resourceType: 'user', resourceId: 'user_456' },
    },
  ],
});

console.log(result.isAuthorized());
checkOptions
CheckOptions
required
options
CheckRequestOptions
result
CheckResult

checkBatch

Perform multiple independent authorization checks.
const results = await workos.fga.checkBatch({
  checks: [
    {
      resource: { resourceType: 'document', resourceId: 'doc_123' },
      relation: 'viewer',
      subject: { resourceType: 'user', resourceId: 'user_456' },
    },
    {
      resource: { resourceType: 'document', resourceId: 'doc_789' },
      relation: 'editor',
      subject: { resourceType: 'user', resourceId: 'user_456' },
    },
  ],
});

results.forEach((result) => {
  console.log(result.isAuthorized());
});
checkOptions
CheckBatchOptions
required
results
CheckResult[]
Array of check results, one for each check.

createResource

Create a new FGA resource.
const resource = await workos.fga.createResource({
  resource: {
    resourceType: 'document',
    resourceId: 'doc_123',
  },
  meta: {
    name: 'My Document',
    owner: 'user_456',
  },
});
resource
CreateResourceOptions
required
resource
Resource
The created resource object.

getResource

Retrieve a resource by type and ID.
const resource = await workos.fga.getResource({
  resourceType: 'document',
  resourceId: 'doc_123',
});

console.log(resource.meta);
resource
ResourceInterface | ResourceOptions
required
resource
Resource
The resource object.

listResources

Retrieve a list of resources.
const resources = await workos.fga.listResources({
  resourceType: 'document',
  search: 'contract',
  limit: 20,
});

for await (const resource of resources) {
  console.log(resource.resourceId, resource.meta);
}
options
ListResourcesOptions
resources
AutoPaginatable<Resource>
An auto-paginatable list of resources.

updateResource

Update a resource’s metadata.
const resource = await workos.fga.updateResource({
  resource: {
    resourceType: 'document',
    resourceId: 'doc_123',
  },
  meta: {
    name: 'Updated Document Name',
  },
});
options
UpdateResourceOptions
required
resource
Resource
The updated resource object.

deleteResource

Delete a resource.
await workos.fga.deleteResource({
  resourceType: 'document',
  resourceId: 'doc_123',
});
resource
DeleteResourceOptions
required

batchWriteResources

Create or delete multiple resources in a single operation.
const resources = await workos.fga.batchWriteResources({
  op: 'CREATE',
  resources: [
    {
      resource: { resourceType: 'document', resourceId: 'doc_123' },
      meta: { name: 'Document 1' },
    },
    {
      resource: { resourceType: 'document', resourceId: 'doc_456' },
      meta: { name: 'Document 2' },
    },
  ],
});
options
BatchWriteResourcesOptions
required
resources
Resource[]
Array of created/deleted resources.

writeWarrant

Create or delete a warrant (relationship between subject and resource).
const warrantToken = await workos.fga.writeWarrant({
  op: 'CREATE',
  resource: { resourceType: 'document', resourceId: 'doc_123' },
  relation: 'viewer',
  subject: { resourceType: 'user', resourceId: 'user_456' },
});

console.log(warrantToken.token);
options
WriteWarrantOptions
required
warrantToken
WarrantToken

batchWriteWarrants

Create or delete multiple warrants in a single operation.
const warrantToken = await workos.fga.batchWriteWarrants([
  {
    op: 'CREATE',
    resource: { resourceType: 'document', resourceId: 'doc_123' },
    relation: 'viewer',
    subject: { resourceType: 'user', resourceId: 'user_456' },
  },
  {
    op: 'CREATE',
    resource: { resourceType: 'document', resourceId: 'doc_123' },
    relation: 'editor',
    subject: { resourceType: 'user', resourceId: 'user_789' },
  },
]);
options
WriteWarrantOptions[]
required
Array of warrant write operations.
warrantToken
WarrantToken
Warrant token for consistent reads.

listWarrants

Retrieve a list of warrants.
const warrants = await workos.fga.listWarrants({
  resourceType: 'document',
  resourceId: 'doc_123',
  limit: 20,
});

for await (const warrant of warrants) {
  console.log(warrant.relation, warrant.subject);
}
options
ListWarrantsOptions
warrants
AutoPaginatable<Warrant>
An auto-paginatable list of warrants.

query

Query for resources or subjects based on warrants.
const results = await workos.fga.query({
  select: 'subject',
  resourceType: 'document',
  resourceId: 'doc_123',
  relation: 'viewer',
});

for await (const result of results) {
  console.log(result.resourceType, result.resourceId);
}
options
QueryOptions
required
results
FgaPaginatable<QueryResult>
A paginatable list of query results.

Migration Guide

To migrate from FGA to the Authorization API:
  1. Replace workos.fga.check() with workos.authorization.check()
  2. Replace resource management with workos.authorization.createResource(), etc.
  3. Use workos.authorization.assignRole() instead of warrant operations
  4. See the Authorization API documentation for complete details

Example: Access Control with FGA

// Create resources
await workos.fga.createResource({
  resource: { resourceType: 'document', resourceId: 'doc_123' },
  meta: { name: 'Confidential Report' },
});

// Grant viewer access
await workos.fga.writeWarrant({
  resource: { resourceType: 'document', resourceId: 'doc_123' },
  relation: 'viewer',
  subject: { resourceType: 'user', resourceId: 'user_456' },
});

// Check access
const result = await workos.fga.check({
  checks: [
    {
      resource: { resourceType: 'document', resourceId: 'doc_123' },
      relation: 'viewer',
      subject: { resourceType: 'user', resourceId: 'user_456' },
    },
  ],
});

if (result.isAuthorized()) {
  console.log('Access granted');
}

Build docs developers (and LLMs) love