Skip to main content
Key cards are plastic cards that unlock doors when presented to a card reader. When you request a card access method in an Access Grant, Seam creates a card credential. Depending on your access control system, you either encode the credential onto a physical card using a card encoder or the system assigns the credential to a pre-registered card automatically. Key cards work with:
  • Access control systems — Salto KS, Salto Space, ASSA ABLOY Visionline and Vostio, dormakaba, Brivo, and other ACS platforms that support card-based credentials. Specify entrances with acs_entrance_ids or use space_ids.

Before You Begin

To use key cards, you need:

Step 1: Verify Entrance Support

List the entrances for your ACS and confirm that can_unlock_with_card is true.
const entrances = await seam.acs.entrances.list({
  acs_system_id: 'c359cba2-8ef2-47fc-bee0-1c7c2a886339',
})

const cardEntrances = entrances.filter(
  (e) => e.can_unlock_with_card
)

Step 2: Create an Access Grant with a Key Card

Create an Access Grant specifying card as the requested access method mode.
const accessGrant = await seam.accessGrants.create({
  user_identity_id: '22222222-2222-2222-2222-222222222222',
  acs_entrance_ids: ['f74e4879-5991-4e2f-a368-888983dcfbfc'],
  requested_access_methods: [
    { mode: 'card' }
  ],
  starts_at: '2025-07-13T15:00:00.000Z',
  ends_at: '2025-07-16T11:00:00.000Z',
})

Step 3: Deliver the Key Card

List the access methods for the Access Grant and check the is_encoding_required property to determine whether you need to encode the card or whether the system assigns it automatically.
const accessMethods = await seam.accessMethods.list({
  access_grant_id: accessGrant.access_grant_id,
})

const card = accessMethods[0]
console.log(card.is_encoding_required)
Output:
{
  "access_method_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "display_name": "Key Card",
  "mode": "card",
  "is_issued": false,
  "is_encoding_required": true,
  ...
}

Encoding Cards

If is_encoding_required is true, you must encode the credential onto a physical card using a card encoder before handing the card to your user. Use the Seam API to encode the card:
const actionAttempt = await seam.accessMethods.encode({
  access_method_id: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
  acs_encoder_id: 'encoder-001',
})
Once encoding is complete, the access method’s is_encoding_required property changes to false and is_issued changes to true. Hand the encoded card to your user. For the complete card encoding workflow, including listing encoders and scanning cards, see Working with Card Encoders and Scanners.

Assigning Cards

If is_assigning_required is true, you can assign an existing credential to the access method by providing the card number. This is common with systems that use pre-registered cards. Use the Seam API to input the card_number for the access method:
const actionAttempt = await seam.accessMethods.assignCard({
  access_method_id: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
  card_number: 'ABCD1234',
})
Once a card is assigned, the access method’s is_assignment_required property changes to false and is_issued changes to true. Hand the assigned card to your user.

Step 4: See Which Doors the Key Card Covers

An access method can cover multiple doors — for example, if the Access Grant includes several entrances or spaces. To see which doors a key card unlocks, call /access_methods/get_related.
const related = await seam.accessMethods.getRelated({
  access_method_ids: [accessMethod.access_method_id],
})

console.log(related.acs_entrances) // entrances this card unlocks

Next Steps