Skip to content

Accessing Arda APIs

All Arda API calls require a Bearer token (ARDA_API_KEY) and a standard set of request headers. Secrets are stored in 1Password vaults and injected at runtime using op run. This guide covers how to discover endpoints, construct authenticated requests, and call any Arda API across all environments.

EnvironmentHost1Password env file
Productionhttps://prod.alpha001.io.arda.cards/api-test/1Password/prod.env
Staginghttps://stage.alpha002.io.arda.cards/api-test/1Password/stage.env
Devhttps://dev.alpha002.io.arda.cards/api-test/1Password/dev.env
Localhttp://localhost:8889/api-test/1Password/local.env

Each env file maps ARDA_API_KEY, BFF_CLIENT_ID, BFF_CLIENT_SECRET, and GATEWAY_BASE_URL to 1Password vault references using op:// URIs.

EnvironmentVault
ProductionArda-SystemsOAM
StagingArda-StageOAM
DevArda-DevOAM

All APIs share the same gateway host per environment. Replace {host} with the environment host from the table above.

DomainAPIBase pathOpenAPI spec
SystemUser Account/v1/user-account{host}/v1/user-account/docs/openApi.json
SystemTenant/v1/userTenant{host}/v1/userTenant/docs/openApi.json
SystemAgentFor/v1/agent-for{host}/v1/agent-for/docs/openApi.json
ReferenceBusiness Affiliate/v1/business-affiliate{host}/v1/business-affiliate/docs/openApi.json
ReferenceItem/v1/item{host}/v1/item/docs/openApi.json
ResourcesKanban Cards/v1/kanban{host}/v1/kanban/docs/openApi.json
TransactionsOrders/v1/order{host}/v1/order/docs/openApi.json

Full API catalog: workspace-jmpicnic/knowledge-base/by-project/general/api-list.md

Every API request must include the following headers:

HeaderValueRequired
AuthorizationBearer ${ARDA_API_KEY}Always
X-Request-IDA unique UUID per requestAlways
X-Tenant-IdThe tenant UUID for the operationAlways
X-AuthorIdentifier of the caller (email or service name)Always
X-oidc-subjectOIDC subject (user ID or service identifier)Always
Content-Typeapplication/jsonPOST/PUT requests only

Ensure 1Password CLI is authenticated before making any calls:

Terminal window
op signin

The op run wrapper injects ARDA_API_KEY and GATEWAY_BASE_URL from the vault into the subprocess environment. Never extract or hardcode these values in shell variables or scripts.

Terminal window
TIMESTAMP_MS=$(date +%s000)
op run --env-file=/api-test/1Password/<env>.env -- \
curl -s \
"${GATEWAY_BASE_URL}/v1/item/item/<entity-id>?effectiveasof=${TIMESTAMP_MS}&recordedasof=${TIMESTAMP_MS}" \
-H "Authorization: Bearer ${ARDA_API_KEY}" \
-H "X-Request-ID: $(uuidgen)" \
-H "X-Author: <author>" \
-H "X-Tenant-Id: <tenant-id>" \
-H "X-oidc-subject: <subject>" | jq .

Replace <env> with prod, stage, dev, or local.

Terminal window
TIMESTAMP_MS=$(date +%s000)
op run --env-file=/api-test/1Password/<env>.env -- \
curl -s -X POST \
"${GATEWAY_BASE_URL}/v1/item/item/<entity-id>/history" \
-H "Authorization: Bearer ${ARDA_API_KEY}" \
-H "X-Request-ID: $(uuidgen)" \
-H "X-Author: <author>" \
-H "X-Tenant-Id: <tenant-id>" \
-H "X-oidc-subject: <subject>" \
-H "Content-Type: application/json" \
-d '{
"since": { "effective": 0, "recorded": 0 },
"until": { "effective": '"${TIMESTAMP_MS}"', "recorded": '"${TIMESTAMP_MS}"' }
}' | jq .
Terminal window
op run --env-file=/api-test/1Password/<env>.env -- \
curl -s -X PUT \
"${GATEWAY_BASE_URL}/v1/item/item/<entity-id>" \
-H "Authorization: Bearer ${ARDA_API_KEY}" \
-H "X-Request-ID: $(uuidgen)" \
-H "X-Author: <author>" \
-H "X-Tenant-Id: <tenant-id>" \
-H "X-oidc-subject: <subject>" \
-H "Content-Type: application/json" \
-d '<json-body>' | jq .
Terminal window
op run --env-file=/api-test/1Password/<env>.env -- \
curl -s -X DELETE \
"${GATEWAY_BASE_URL}/v1/item/item/<entity-id>" \
-H "Authorization: Bearer ${ARDA_API_KEY}" \
-H "X-Request-ID: $(uuidgen)" \
-H "X-Author: <author>" \
-H "X-Tenant-Id: <tenant-id>" \
-H "X-oidc-subject: <subject>" | jq .

Most GET endpoints support optional time-travel parameters:

ParameterTypeDescription
effectiveasofEpoch millisecondsEffective time boundary for the query
recordedasofEpoch millisecondsRecorded time boundary for the query

When omitted, the server defaults to “now”. To read current state explicitly, generate a timestamp and append it to the query string:

Terminal window
TIMESTAMP_MS=$(date +%s000)
# append: ?effectiveasof=${TIMESTAMP_MS}&recordedasof=${TIMESTAMP_MS}
  • Use $(uuidgen) for X-Request-ID to guarantee uniqueness across requests.
  • Pipe output through jq . for readable JSON formatting.
  • Redirect large response payloads to a scratch/ subdirectory rather than printing them to the terminal.
  • The GATEWAY_BASE_URL and ARDA_API_KEY variables are populated by op run from the env file — reference them directly in the curl command without first extracting them.
  • The 1Password CLI may prompt for biometric authentication, which blocks until confirmed. Be prepared to authenticate when running op run commands.

Copyright: (c) Arda Systems 2025-2026, All rights reserved