Skill Tracer
Skills › Scientific Agent Skills › labarchive-integration › authentication_guide.md

authentication_guide.md

213 lines · skills/labarchive-integration/references/authentication_guide.md at 5f2bc03

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1# LabArchives Authentication and Regions
2
3Verified against official public sources on **2026-09-30**. LabArchives may
4provide additional institution-specific development documentation with API
5credentials; that documentation controls when it differs from this summary.
6

LabArchives Authentication and Regions

Verified against official public sources on 2026-09-30. LabArchives may provide additional institution-specific development documentation with API credentials; that documentation controls when it differs from this summary.

Raw lines 1 to 6
7## Access prerequisites
8

Access prerequisites

Raw lines 7 to 8
9### ELN
11The official ELN subscription guide (updated 2026-08-27) lists developer API
12access as an Enterprise capability. An Access Key ID and Access Password are
13issued by LabArchives for a specific organization/vendor and intended purpose.
14They are not ordinary account credentials.
16Official source:
17https://help.labarchives.com/hc/en-us/articles/11723701830676-ELN-for-Research-Introduction-and-Subscription-Plans

ELN

The official ELN subscription guide (updated 2026-08-27) lists developer API access as an Enterprise capability. An Access Key ID and Access Password are issued by LabArchives for a specific organization/vendor and intended purpose. They are not ordinary account credentials.

Official source: https://help.labarchives.com/hc/en-us/articles/11723701830676-ELN-for-Research-Introduction-and-Subscription-Plans

Raw lines 9 to 18
19### Inventory API v1
21The Inventory FAQ (updated 2026-05-19) states that API access is available only
22to Enterprise and Enterprise Plus licensees. The caller must:
24- have a LabArchives account,
25- have an Inventory account,
26- be given API access, and
27- remain subject to Inventory application access rights.
29An eligible Inventory license member can request access through
30`support@labarchives.com`.
32Official source:
33https://help.labarchives.com/hc/en-us/articles/11811035048212-Inventory-FAQs

Inventory API v1

The Inventory FAQ (updated 2026-05-19) states that API access is available only to Enterprise and Enterprise Plus licensees. The caller must:

  • have a LabArchives account,
  • have an Inventory account,
  • be given API access, and
  • remain subject to Inventory application access rights.

An eligible Inventory license member can request access through support@labarchives.com.

Official source: https://help.labarchives.com/hc/en-us/articles/11811035048212-Inventory-FAQs

Raw lines 19 to 34
35## Credential types
37Keep these values distinct:
39- **Access Key ID (`akid`)** — identifies the API client.
40- **Access Password** — secret HMAC-SHA-512 key; it is never sent as an API
41 parameter or request-body field.
42- **UID** — user ID scoped to the Access Key ID that obtained it. It is
43 persistent until revoked, but it is not portable across API keys.
44- **Authorization code** — short-lived value returned by the API user-login
45 flow and redeemed promptly through `users::user_access_info`.
46- **Temporary password token** — user-generated alternative accepted as the
47 `password` parameter by `users::user_access_info`.
48- **Inventory Lab ID** — identifies the current Inventory lab and is documented
49 as `X-LabArchives-LabId`; the `/public/v1/users/me` bootstrap endpoint does
50 not require this header and ignores it if supplied.
52Do not use a normal LabArchives account password in API scripts.

Credential types

Keep these values distinct:

  • **Access Key ID (akid)** — identifies the API client.
  • Access Password — secret HMAC-SHA-512 key; it is never sent as an API parameter or request-body field.
  • UID — user ID scoped to the Access Key ID that obtained it. It is persistent until revoked, but it is not portable across API keys.
  • Authorization code — short-lived value returned by the API user-login flow and redeemed promptly through users::user_access_info.
  • Temporary password token — user-generated alternative accepted as the password parameter by users::user_access_info.
  • Inventory Lab ID — identifies the current Inventory lab and is documented as X-LabArchives-LabId; the /public/v1/users/me bootstrap endpoint does not require this header and ignores it if supplied.

Do not use a normal LabArchives account password in API scripts.

Raw lines 35 to 53
54## Regional browser and ELN API hosts
56The two host types are intentionally shown in separate columns. Login URLs come
57from the help-center SSO article updated **2025-11-04**; API URLs come from the
58official ELN API overview updated **2025-11-03**.
60| Region | Browser login | ELN API URL |
61|---|---|---|
62| US and rest of world | `https://mynotebook.labarchives.com` | `https://api.labarchives.com/api` |
63| Canada | `https://ca-mynotebook.labarchives.com` | `https://caapi.labarchives.com/api` |
64| Australia/New Zealand | `https://au-mynotebook.labarchives.com` | `https://auapi.labarchives.com/api` |
65| United Kingdom | `https://uk-mynotebook.labarchives.com` | `https://ukapi.labarchives.com/api` |
66| Europe outside the UK | `https://eu-mynotebook.labarchives.com` | `https://euapi.labarchives.com/api` |
68Official sources:
70- https://help.labarchives.com/hc/en-us/articles/11728160845332-Using-an-Institutional-Single-Sign-on-for-LabArchives-Access
71- https://mynotebook.labarchives.com/share/LabArchives%20API/NS4yfDI3LzQvVHJlZU5vZGUvMTF8MTMuMg
73The official ELN overview recommends `utilities::api_base_urls` for distributed
74applications so they can discover future regional API additions. The bundled
75validator intentionally pins the five hosts documented at this refresh date.

Regional browser and ELN API hosts

The two host types are intentionally shown in separate columns. Login URLs come from the help-center SSO article updated 2025-11-04; API URLs come from the official ELN API overview updated 2025-11-03.

RegionBrowser loginELN API URL
US and rest of worldhttps://mynotebook.labarchives.comhttps://api.labarchives.com/api
Canadahttps://ca-mynotebook.labarchives.comhttps://caapi.labarchives.com/api
Australia/New Zealandhttps://au-mynotebook.labarchives.comhttps://auapi.labarchives.com/api
United Kingdomhttps://uk-mynotebook.labarchives.comhttps://ukapi.labarchives.com/api
Europe outside the UKhttps://eu-mynotebook.labarchives.comhttps://euapi.labarchives.com/api

Official sources:

  • https://help.labarchives.com/hc/en-us/articles/11728160845332-Using-an-Institutional-Single-Sign-on-for-LabArchives-Access
  • https://mynotebook.labarchives.com/share/LabArchives%20API/NS4yfDI3LzQvVHJlZU5vZGUvMTF8MTMuMg

The official ELN overview recommends utilities::api_base_urls for distributed applications so they can discover future regional API additions. The bundled validator intentionally pins the five hosts documented at this refresh date.

Raw lines 54 to 76
77### Inventory absolute base URLs
79The official notebook's **Inventory > Overview** publishes
80`https://iapi.labarchives.com` as the base URL for current endpoints. Append the
81exact `/public/v1/...` route. It specifies `Content-Type: application/json` for
82requests; responses can be JSON or ZIP depending on the method. A regional
83absolute base-URL table is not provided. Confirm any region-specific deployment
84with LabArchives rather than deriving a host from a browser login URL.

Inventory absolute base URLs

The official notebook's Inventory > Overview publishes https://iapi.labarchives.com as the base URL for current endpoints. Append the exact /public/v1/... route. It specifies Content-Type: application/json for requests; responses can be JSON or ZIP depending on the method. A regional absolute base-URL table is not provided. Confirm any region-specific deployment with LabArchives rather than deriving a host from a browser login URL.

Raw lines 77 to 85
86### Inventory lab discovery
88`GET /public/v1/users/me` explicitly does not require `X-LabArchives-LabId`
89(and ignores it if supplied). Sign `/public/v1/users/me` and send the UID,
90Access Key ID, signature, and expires headers. The JSON response contains
91`userId`, `userName`, `status`, and `labs` entries with `labId` and `name`. Select
92an authorized lab before issuing lab-scoped requests. The numeric Inventory
93`userId` is not the Access-Key-scoped ELN UID used for authentication.
95Official method page:
96https://mynotebook.labarchives.com/share/LabArchives%20API/MTQ4LjIwMDAwMDAwMDAwMDAyfDI3LzExNC9UcmVlTm9kZS8zODc0Mjc0OTI5fDM3Ni4y

Inventory lab discovery

GET /public/v1/users/me explicitly does not require X-LabArchives-LabId (and ignores it if supplied). Sign /public/v1/users/me and send the UID, Access Key ID, signature, and expires headers. The JSON response contains userId, userName, status, and labs entries with labId and name. Select an authorized lab before issuing lab-scoped requests. The numeric Inventory userId is not the Access-Key-scoped ELN UID used for authentication.

Official method page: https://mynotebook.labarchives.com/share/LabArchives%20API/MTQ4LjIwMDAwMDAwMDAwMDAyfDI3LzExNC9UcmVlTm9kZS8zODc0Mjc0OTI5fDM3Ni4y

Raw lines 86 to 97
98## Named environment variables
100These names are conventions used by this skill's local helpers:
102```text
103LABARCHIVES_ELN_API_URL
104LABARCHIVES_ACCESS_KEY_ID
105LABARCHIVES_ACCESS_PASSWORD
106LABARCHIVES_USER_ID
107LABARCHIVES_INVENTORY_LAB_ID
108```
110Use a shell session, OS keychain, workload secret store, or institution-approved
111secret manager to populate them. The scripts:
113- inspect only these exact names,
114- never walk parent directories for `.env`,
115- never write secret files, and
116- never print credential values.
118Validate presence and endpoint selection:
120```bash
121uv run scripts/setup_config.py check
122uv run scripts/setup_config.py check \
123 --require-user-id --require-inventory-lab-id
124```
126`--prompt-missing-secret` uses `getpass` for a missing Access Password and keeps
127the value in memory only. It does not save or authenticate it.

Named environment variables

These names are conventions used by this skill's local helpers:

LABARCHIVES_ELN_API_URL
LABARCHIVES_ACCESS_KEY_ID
LABARCHIVES_ACCESS_PASSWORD
LABARCHIVES_USER_ID
LABARCHIVES_INVENTORY_LAB_ID

Use a shell session, OS keychain, workload secret store, or institution-approved secret manager to populate them. The scripts:

  • inspect only these exact names,
  • never walk parent directories for .env,
  • never write secret files, and
  • never print credential values.

Validate presence and endpoint selection:

uv run scripts/setup_config.py check
uv run scripts/setup_config.py check \
  --require-user-id --require-inventory-lab-id

--prompt-missing-secret uses getpass for a missing Access Password and keeps the value in memory only. It does not save or authenticate it.

Raw lines 98 to 128
Runs code scripts/setup_config.py :121
129## ELN API user authorization
131The official page describes an **OAuth-like** redirect flow. It does not
132document generic OAuth 2.0 client credentials, `/oauth/authorize`, or
133`/oauth/token` endpoints.
1351. Select the user's correct regional API host.
1362. Redirect the user to the host's `/api_user_login` path with `akid`,
137 `expires`, `sig`, and `redirect_uri`.
1383. For this special signature, use the exact **unencoded redirect URI** in place
139 of the normal API method name.
1404. LabArchives performs account/SSO login and redirects back with `auth_code`
141 and `email`.
1425. Promptly call the documented `users::user_access_info`, passing the
143 authorization code as its `password` parameter and the returned email as
144 `login_or_email`. The method uses GET query parameters, so redact the whole
145 query and any echoed authentication fields in the XML response.
1466. Store the resulting UID only in approved secure state. It remains bound to
147 the Access Key ID and can be revoked. Respect `<auto-login-allowed>` and
148 institutional restrictions; `user_info_via_id` documents `authenticated=true`
149 only for an explicit user request to extend the session.
151If redirects cannot be used, the official flow allows a user-generated
152temporary password token in the same `password` parameter. Handle it with
153`getpass` or a secure UI field; never put it on a command line or in a log.
155Official user-login page (updated 2023-03-03):
156https://mynotebook.labarchives.com/share/LabArchives%20API/ODEuOXwyNy82My05My9UcmVlTm9kZS8yMjYyMTU0MTg3fDIwNy44OTk5OTk5OTk5OTk5OA==

ELN API user authorization

The official page describes an OAuth-like redirect flow. It does not document generic OAuth 2.0 client credentials, /oauth/authorize, or /oauth/token endpoints.

  1. Select the user's correct regional API host.
  2. Redirect the user to the host's /api_user_login path with akid, expires, sig, and redirect_uri.
  3. For this special signature, use the exact unencoded redirect URI in place of the normal API method name.
  4. LabArchives performs account/SSO login and redirects back with auth_code and email.
  5. Promptly call the documented users::user_access_info, passing the authorization code as its password parameter and the returned email as login_or_email. The method uses GET query parameters, so redact the whole query and any echoed authentication fields in the XML response.
  6. Store the resulting UID only in approved secure state. It remains bound to the Access Key ID and can be revoked. Respect <auto-login-allowed> and institutional restrictions; user_info_via_id documents authenticated=true only for an explicit user request to extend the session.

If redirects cannot be used, the official flow allows a user-generated temporary password token in the same password parameter. Handle it with getpass or a secure UI field; never put it on a command line or in a log.

Official user-login page (updated 2023-03-03): https://mynotebook.labarchives.com/share/LabArchives%20API/ODEuOXwyNy82My05My9UcmVlTm9kZS8yMjYyMTU0MTg3fDIwNy44OTk5OTk5OTk5OTk5OA==

Raw lines 129 to 157
158## Request signing
160The official call-authentication page (updated 2023-05-10) defines:
162```text
163message = AccessKeyID + api_method_input + expires
164signature = Base64(HMAC-SHA-512(key=AccessPassword, message=message))
165```
167There are no separators. `expires` is current epoch milliseconds, corrected for
168server clock skew when needed—not a future token lifetime. The official page
169allows two minutes for latency/minor clock synchronization, while the
170best-practices page recommends `utilities::epoch_time` for unreliable clocks.
172- **ELN ordinary call:** `api_method_input` is the method name only, without its
173 class.
174- **ELN user-login redirect:** it is the unencoded redirect URI.
175- **Inventory v1:** it is the exact relative route, including resolved path
176 parameters and excluding the query string.
178Official signing page:
179https://mynotebook.labarchives.com/share/LabArchives%20API/Ny44fDI3LzYvVHJlZU5vZGUvMTE1MzU5MTAyNXwxOS44
181`GET /api/utilities/epoch_time` takes `akid` but does not require `sig` or
182`expires`. Its XML `<epoch-time>` is epoch milliseconds. Cache a session clock
183offset instead of calling this utility before every signature.
185Use `scripts/entry_operations.py self-test` to check the implementation against
186the official published test vector without credentials or network access.

Request signing

The official call-authentication page (updated 2023-05-10) defines:

message = AccessKeyID + api_method_input + expires
signature = Base64(HMAC-SHA-512(key=AccessPassword, message=message))

There are no separators. expires is current epoch milliseconds, corrected for server clock skew when needed—not a future token lifetime. The official page allows two minutes for latency/minor clock synchronization, while the best-practices page recommends utilities::epoch_time for unreliable clocks.

  • ELN ordinary call: api_method_input is the method name only, without its class.
  • ELN user-login redirect: it is the unencoded redirect URI.
  • Inventory v1: it is the exact relative route, including resolved path parameters and excluding the query string.

Official signing page: https://mynotebook.labarchives.com/share/LabArchives%20API/Ny44fDI3LzYvVHJlZU5vZGUvMTE1MzU5MTAyNXwxOS44

GET /api/utilities/epoch_time takes akid but does not require sig or expires. Its XML <epoch-time> is epoch milliseconds. Cache a session clock offset instead of calling this utility before every signature.

Use scripts/entry_operations.py self-test to check the implementation against the official published test vector without credentials or network access.

Raw lines 158 to 187
Runs code scripts/entry_operations.py :185
188## TLS and secret handling
190- Permit only `https`.
191- Never disable certificate or hostname validation.
192- If an institutional interception proxy is required, use its approved CA
193 bundle and keep hostname verification enabled.
194- Reject credentials embedded in URLs and reject redirects to unapproved hosts.
195- Do not log full ELN URLs after signing; authentication appears in the query.
196- Do not log Inventory authentication headers.
197- Do not include the Access Password in query parameters, headers, form data, or
198 JSON. It is an HMAC key only.
199- Rotate/revoke credentials through LabArchives after suspected exposure.

TLS and secret handling

  • Permit only https.
  • Never disable certificate or hostname validation.
  • If an institutional interception proxy is required, use its approved CA bundle and keep hostname verification enabled.
  • Reject credentials embedded in URLs and reject redirects to unapproved hosts.
  • Do not log full ELN URLs after signing; authentication appears in the query.
  • Do not log Inventory authentication headers.
  • Do not include the Access Password in query parameters, headers, form data, or JSON. It is an HMAC key only.
  • Rotate/revoke credentials through LabArchives after suspected exposure.
Raw lines 188 to 200
201## Troubleshooting checklist
2031. Confirm API access is enabled for the exact product and account.
2042. Confirm the browser account and API host belong to the same region.
2053. Confirm the UID was obtained with the same Access Key ID now in use.
2064. Confirm the local clock or `epoch_time` adjustment.
2075. Confirm the signing input: method-only for ELN, exact relative route for
208 Inventory, unencoded redirect URI for user login.
2096. Confirm URL encoding is applied only after Base64 for the ELN `sig`.
2107. Confirm Inventory path parameters are resolved and query parameters excluded
211 from its signature.
2128. Report status, official API error code, and a redacted response to support.
213 Never include signatures, authorization codes, tokens, or passwords.

Troubleshooting checklist

  1. Confirm API access is enabled for the exact product and account.
  2. Confirm the browser account and API host belong to the same region.
  3. Confirm the UID was obtained with the same Access Key ID now in use.
  4. Confirm the local clock or epoch_time adjustment.
  5. Confirm the signing input: method-only for ELN, exact relative route for Inventory, unencoded redirect URI for user login.
  6. Confirm URL encoding is applied only after Base64 for the ELN sig.
  7. Confirm Inventory path parameters are resolved and query parameters excluded from its signature.
  8. Report status, official API error code, and a redacted response to support. Never include signatures, authorization codes, tokens, or passwords.
Raw lines 201 to 213