WardeDocs Administrators Connectors People using Warde warde.app

Administrator guide

Joiners, movers and leavers

Have your HR system or identity platform call Warde when someone joins, moves or leaves, and follow what became of each call.

Warde does not detect joiners, movers and leavers. Your HR system or identity platform already does, and knows more about a new joiner than ServiceNow does. Have that process call Warde, and Warde grants the birthright bundles the person should hold, records who has what and why, and tracks the work like any other request.

There are two ways in, and both do the same things:

What you can ask for

ActionForWhat Warde does
grant_templateA joiner, or a mover gaining a bundleGrants one bundle
revoke_templateA mover losing a bundleRemoves one bundle
reconcileA nightly check, or a moverBrings the person to exactly the bundles you list: grants what is missing and removes what is not listed. [] means no bundles.
deprovisionA leaverRemoves every entitlement the person holds through Warde

Each call raises one ServiceNow request with a line per entitlement, using a hidden catalog item with no approval: your process is the approval. Engine lines go to the fulfilment queue and manual lines become tasks, exactly as for a request.

Set up the caller

  1. Create a service account for the calling system, and grant it x_66256_warde.lifecycle_integration in Guided Setup step 1. Do not give it the administrator role.
  2. Create your birthright bundles. See Access bundles.
  3. Choose what Warde does by default in Guided Setup step 14.

Who does which part

A bundle often mixes access an engine can grant with access only a person can. Choose which half Warde takes:

SettingWarde doesWarde hands back
all (the default)Everything: engine grants and catalog tasksNothing
auto_onlyOnly what an engine can grant. No task is raised.Everything that would have been a task
manual_onlyOnly the catalog tasksEverything an engine could have granted

The setting is decided by the most specific of three places:

  1. fulfilment in the call itself;
  2. a row for the calling system on the lifecycle integrations list, matched on the service account (add one from Guided Setup step 14);
  3. the instance default, x_66256_warde.lifecycle.fulfilment.

Whatever Warde does not take on comes back in skipped, one entry per entitlement with the reason, so your process knows what is still its job.

The REST endpoint

POST /api/x_66256_warde/lifecycle/event
Content-Type: application/json

Authenticate as the service account, with basic auth or OAuth.

{
  "subject":        { "field": "employee_number", "value": "E4471" },
  "action":         "grant_template",
  "names":          ["Finance Analyst"],
  "reason":         "Joiner: HR case HRC0012345",
  "correlation_id": "hrcase:HRC0012345"
}
FieldNotes
subject{"sys_id": "..."}, or {"field": ..., "value": ...} where field is sys_id, user_name, email or employee_number. Two people matching one value is refused rather than guessed.
actiongrant_template, revoke_template, reconcile or deprovision
names or templatesBundle names, or bundle sys_ids. grant_template and revoke_template take exactly one. reconcile takes a list, and must send one.
fulfilmentOptional: all, auto_only or manual_only
reasonRecorded on the request and every line. Put your source record's number in it.
correlation_idYour own id for this event. It makes the call safe to retry, and it is how you ask about the call later.
assigned_viaOptional. birthright (the default) or request. Birthright access cannot be removed by the person themselves.

Responses

CodeMeaning
202Accepted, with lines in flight. Ask about them with the GET below.
200Nothing in flight: the person already held the bundle, everything was left to you, or every line was refused. skipped says which.
400A bad body, an unknown action, a person who matches nobody or more than one, an unknown bundle, or a refusal
403The caller does not hold the lifecycle integration role
500Warde wrote nothing. Send it again with the same correlation_id.

Retries

Send a correlation_id that is specific to one event, such as hrcase: and the case's sys_id. A call sent again with the same id returns the first answer and grants nothing twice. Do not use an id like leaver: and the person's sys_id alone: a rehired person's second leaving would be answered from the first. An id sent again for a different action or bundle is refused.

Ask what became of a call

GET /api/x_66256_warde/lifecycle/event?correlation_id=hrcase:HRC0012345

The reply lists the request and each line with its state: queued, in_progress, complete, failed or cancelled, the date the access was promised by, and the task number for manual work. done is true once nothing is queued or in progress. A failed line can still move, for example when an engine recovers, so keep asking for as long as you want to know.

Warde does not call your system back.

Example

curl -u "$SN_USER:$SN_PASS" -H "Content-Type: application/json" \
  -X POST "https://<instance>.service-now.com/api/x_66256_warde/lifecycle/event" \
  -d '{ "subject": { "field": "user_name", "value": "ada.okafor" }, "action": "deprovision", "reason": "Leaver: HR case HRC0012399", "correlation_id": "hrcase:HRC0012399" }'

From inside ServiceNow

var api = new x_66256_warde.WardeLifecycleApi();

api.grantTemplate(userId, templateId, opts);      // joiner or mover: grant a bundle
api.revokeTemplate(userId, templateId, opts);     // mover: remove a bundle
api.reconcile(userId, desiredTemplateIds, opts);  // bring the person to exactly these bundles
api.deprovision(userId, opts);                    // leaver: remove everything
api.status(correlationId);                        // what became of a call

opts takes reason, assigned_via, fulfilment, correlation_id, and actor, the user recorded on the audit history. Every method returns the same envelope as the REST reply. A script in another scope needs its cross-scope access approved the first time it calls.

What goes in a birthright bundle

If your identity platform already grants birthright access by its own rules, such as ISC role membership criteria or Entra dynamic groups, leave that access out of the bundle, and leave out the platform's birthright role. Under all, Warde would ask the platform for a role it already assigns. The bundle then holds what the platform does not grant, usually the manual remainder. Warde still shows the platform's rule-given access on My Access and in reviews.

Where to see the results

WhatWhere
One callThe GET above, or the request item the call returned
A leaver's removals that have not finishedThe Leavers dashboard in the Admin Workspace, with the leaver chosen in its filter, or the report Leaver report: removals not finished
Access still active for anyone who has leftThe two Access still active after leaving tiles on the Leavers dashboard, or the report Leaver report: access still active. This includes leavers your platform handled without calling Warde.
Who holds which bundleThe access bundle holdings list
Manual workThe catalog tasks on each collection's support group

Guided Setup step 14 shows counts of recent lifecycle calls and links to each list.

Limits

Warde is a ServiceNow scoped application, x_66256_warde. These guides describe the current release. Questions go to hello@warde.app.

ServiceNow is a trademark of ServiceNow, Inc. SailPoint, IdentityIQ and Identity Security Cloud are trademarks of SailPoint Technologies, Inc. Microsoft and Microsoft Entra are trademarks of the Microsoft group of companies.