3.x vs 4.x: what changed¶
This page compares the APIM 3.2.0 database (the 3.x series) with the APIM 4.7.0 database (the 4.x series). It covers the table definitions and how APIM uses them.
The short version
The core of the model survives unchanged: subscriber → application → subscription ← API, plus keys and throttling policies. 4.x builds a lot around that core:
- Revisions. You deploy a frozen snapshot of an API, not the live API.
- Gateway environments and VHosts in the database. In 3.x these were names in a config file.
- The API's UUID moves into
AM_API. In 3.x it only lived in the registry. ORGANIZATIONcolumns start to replace tenant IDs on the main tables.- Many new feature areas: operation policies, persisted API keys, the service catalog, multiple endpoints, governance and AI/LLM APIs.
- Deletes cascade more. Several links that used to block deletes now cascade.
Headline numbers¶
| 3.2.0 | 4.7.0 | Change | |
|---|---|---|---|
| Tables, total | 200 | 298 | +98 (101 added, 3 removed) |
AM_* (API Manager core) |
57 | 112 | +55 |
GOV_* (governance) |
— | 14 | +14 |
IDN_* (identity & OAuth) |
59 | 77 | +18 |
UM_* (users, roles, tenants) |
24 | 34 | +10 |
SP_* (service providers) |
12 | 13 | +1 |
REG_*, IDP_*, CM_*, WF_*, FIDO* |
17, 12, 10, 7, 2 | same | 0 |
| Declared foreign keys, total | 126 | 211 | +85 |
Declared FKs on AM_* tables |
28 | 74 | +46 |
Tables with a REVISION_UUID-style column |
0 | 20 | +20 |
AM_* tables with an ORGANIZATION column |
0 | 20 | +20 |
Only 3 tables were removed: AM_LABELS, AM_LABEL_URLS and AM_SUBSCRIPTION_KEY_MAPPING. Everything that existed in 3.2.0 is still there in 4.7.0, although some tables gained columns.
The big changes¶
1. Gateway labels → revisions, environments and VHosts¶
In 3.x, gateways were configured in deployment.toml and never appeared in the database. By default, publishing pushed the API straight to those gateways. Only when the optional database artifact sync was turned on did publishing write the artifact into AM_GW_API_ARTIFACTS, keyed by a gateway label, with a GATEWAY_INSTRUCTION column (publish or remove) telling each gateway what to do. On a default 3.2.0 install that table stays empty.
In 4.x, you first create a revision, which is a frozen copy of the API. Then you deploy that revision to a gateway environment and a VHost. The environments are now database rows.
flowchart LR
subgraph "3.x"
A3[AM_API] -.-> G3["AM_GW_API_ARTIFACTS<br/>(per gateway label, only if DB sync is on)"]
end
subgraph "4.x"
A4[AM_API] --> R4[AM_REVISION]
R4 --> D4[AM_DEPLOYMENT_REVISION_MAPPING]
E4[AM_GATEWAY_ENVIRONMENT] --> D4
R4 --> G4["AM_GW_API_ARTIFACTS<br/>(per revision)"]
end
AM_GW_API_ARTIFACTSchanged its key from(GATEWAY_LABEL, API_ID)to(REVISION_ID, API_ID). It also lostGATEWAY_INSTRUCTION, because deploy and undeploy state now lives in the deployment tables.- Creating a revision writes its artifact to
AM_GW_API_ARTIFACTSstraight away. Deploying the revision then writesAM_DEPLOYMENT_REVISION_MAPPING(the request),AM_GW_API_DEPLOYMENTS, andAM_GW_REVISION_DEPLOYMENT, which records the gateway'sSUCCESSacknowledgement.AM_DEPLOYED_REVISIONisn't used by the built-in gateway. Environments and VHosts created in the Admin Portal are stored inAM_GATEWAY_ENVIRONMENTandAM_GW_VHOST, but the Default environment fromdeployment.tomlisn't. - 20 tables now carry a revision column. The working copy of an API has the sentinel value
'Current API'orNULLthere. Revision rows copy the URL mappings, endpoints, policies and so on, each tagged with the revision's UUID.
See Revisions & deployment (4.x) and Gateway publishing (3.x).
2. The API's UUID moves into AM_API¶
In 3.x, AM_API identifies an API by an integer API_ID plus the unique set (provider, name, version). The API's UUID, which the REST APIs use, is the registry artifact ID REG_RESOURCE.REG_UUID. It isn't in AM_API at all.
In 4.x, AM_API.API_UUID holds the UUID, and almost every new table joins on it rather than on the integer ID.
flowchart LR
subgraph "3.x"
A3["AM_API<br/>API_ID"] -. "logical: provider/name/version" .-> R3["REG_RESOURCE<br/>REG_UUID"]
end
subgraph "4.x"
A4["AM_API<br/>API_ID + API_UUID"] --> N4["new tables<br/>(join on API_UUID)"]
end
Two kinds of API ID
Even in 4.x, older tables such as AM_SUBSCRIPTION, AM_API_URL_MAPPING and AM_API_LC_EVENT still join on the integer API_ID. The gateway tables (AM_GW_PUBLISHED_API_DETAILS.API_ID) hold the UUID string in both series.
3. Tenant IDs → ORGANIZATION scoping¶
3.x scopes data with TENANT_ID (an integer, e.g. -1234) or TENANT_DOMAIN (e.g. carbon.super). 4.x adds an ORGANIZATION column to 20 AM_* tables, including AM_API, AM_APPLICATION, AM_KEY_MANAGER, AM_API_CATEGORIES and AM_API_DEFAULT_VERSION. For a plain tenant, its value is the tenant domain.
flowchart LR
T["Tenant carbon.super<br/>(UM_TENANT)"] --> O["ORGANIZATION = 'carbon.super'"]
O --> API[AM_API]
O --> APP[AM_APPLICATION]
T --> P["AM_POLICY_*<br/>(still TENANT_ID)"]
- Uniqueness rules now include the organization. For example,
AM_APIis unique on (provider, name, version, organization), andAM_KEY_MANAGERon (name, organization) instead of (name, tenant domain). - The switch isn't complete. Throttling policies (
AM_POLICY_SUBSCRIPTION,AM_POLICY_APPLICATION,AM_API_THROTTLE_POLICY,AM_POLICY_GLOBAL,AM_POLICY_HARD_THROTTLING) and 15 otherAM_*tables still useTENANT_ID. UM_TENANTgainsUM_TENANT_UUIDandUM_ORG_UUID. The newUM_ORG*tables andAM_ORGANIZATION_MAPPINGmodel sub-organizations.
4. Operation policies¶
3.x only had per-API mediation sequences, which lived in the registry. 4.x adds reusable operation policies: a policy is defined once, then attached to an API resource, to a whole API, or to a gateway globally.
erDiagram
AM_OPERATION_POLICY ||--o{ AM_OPERATION_POLICY_DEFINITION : "has code for"
AM_OPERATION_POLICY ||--o{ AM_API_OPERATION_POLICY_MAPPING : "attached via"
AM_API_URL_MAPPING ||--o{ AM_API_OPERATION_POLICY_MAPPING : "resource"
AM_OPERATION_POLICY ||--o{ AM_API_POLICY_MAPPING : "API-level"
AM_OPERATION_POLICY ||--o{ AM_GATEWAY_POLICY_MAPPING : "gateway-level"
AM_COMMON_OPERATION_POLICY marks the shared, organization-wide policies. AM_API_OPERATION_POLICY holds API-specific copies (CLONED_POLICY_UUID). Gateway-wide (global) policies use AM_GATEWAY_POLICY_METADATA → AM_GATEWAY_POLICY_MAPPING → AM_GATEWAY_POLICY_DEPLOYMENT. See Operation policies.
5. API keys: AM_SUBSCRIPTION_KEY_MAPPING removed, AM_API_KEY* added¶
3.x had AM_SUBSCRIPTION_KEY_MAPPING (SUBSCRIPTION_ID, ACCESS_TOKEN, KEY_TYPE), a legacy link between access tokens and subscriptions. 3.x API keys are self-contained signed JWTs and aren't stored in the database. Revoking one adds a row to AM_REVOKED_JWT.
4.x removes that table and adds persisted API keys. Only a hash of each key is stored, and a key can be tied to APIs and/or applications.
erDiagram
AM_API_KEY ||--o{ AM_API_KEY_API_MAPPING : "valid for"
AM_API ||--o{ AM_API_KEY_API_MAPPING : ""
AM_API_KEY ||--o{ AM_API_KEY_APPLICATION_MAPPING : "belongs to"
AM_APPLICATION ||--o{ AM_API_KEY_APPLICATION_MAPPING : ""
AM_API_KEY stores API_KEY_HASH (unique), KEY_TYPE, STATUS, VALIDITY_PERIOD and LAST_USED. Both mapping tables join on UUIDs (API_UUID and APPLICATION_UUID), not integer IDs.
6. Service catalog¶
4.x adds a service catalog, a registry of backend services with their definitions. An API can be created from a service, and the link is recorded.
flowchart LR
S["AM_SERVICE_CATALOG<br/>SERVICE_KEY, MD5"] -. "logical: SERVICE_KEY" .-> M[AM_API_SERVICE_MAPPING]
A[AM_API] --> M
AM_API_SERVICE_MAPPING keeps the service's MD5 from when the API was created. Comparing it with the catalog's current MD5 tells APIM that the service has changed since. Both tables are scoped by TENANT_ID.
7. Endpoints and backends¶
In 3.x, an API's endpoint configuration lived only in the registry artifact. 4.x can store several named endpoints per API (for example, per key type) and choose a primary one. It also adds backend definitions for newer API types.
erDiagram
AM_API ||--o{ AM_API_ENDPOINTS : "has"
AM_API ||--o{ AM_API_PRIMARY_EP_MAPPING : "primary"
AM_API ||--o{ AM_BACKEND : "references"
AM_BACKEND ||--o{ AM_BACKEND_OPERATION_MAPPING : "serves"
AM_API_URL_MAPPING ||--o{ AM_BACKEND_OPERATION_MAPPING : "resource"
All of these are revision-aware. AM_API_SEQUENCE_BACKEND (custom sequence backends) and AM_API_METADATA (key/value metadata) are revision-aware too.
8. Governance¶
This area is entirely new in 4.x. You define rulesets (for example, linting rules), group them into policies, and APIM checks each API (an artifact) against them. Every check leaves results and violations behind.
erDiagram
GOV_POLICY ||--o{ GOV_POLICY_RULESET : "uses"
GOV_RULESET ||--o{ GOV_POLICY_RULESET : ""
GOV_RULESET ||--o{ GOV_RULESET_RULE : "contains"
GOV_ARTIFACT ||--o{ GOV_RULESET_RUN : "checked in"
GOV_RULESET_RUN ||--o{ GOV_RULE_VIOLATION : "finds"
GOV_ARTIFACT.ARTIFACT_REF_ID points to the API's UUID (a logical link, no FK). See Governance.
9. AI / LLM APIs¶
4.x can front LLM providers. A provider and its models are stored once, and an AI API links to a provider (per revision). Subscription tiers can also cap token usage.
erDiagram
AM_LLM_PROVIDER ||--o{ AM_LLM_PROVIDER_MODEL : "offers"
AM_LLM_PROVIDER ||--o{ AM_API_AI_CONFIGURATION : "used by"
AM_API ||--o{ AM_API_AI_CONFIGURATION : "configured with"
AM_POLICY_SUBSCRIPTION gains TOTAL_TOKEN_COUNT, PROMPT_TOKEN_COUNT and COMPLETION_TOKEN_COUNT for AI token quotas. See AI APIs.
10. New identity tables¶
The embedded Identity Server grew by 18 IDN_* tables. The ones that matter to APIM flows are:
flowchart LR
C[IDN_OAUTH_CONSUMER_APPS] --> S["IDN_OAUTH_CONSUMER_SECRETS<br/>(several secrets per app)"]
C -. "logical: CONSUMER_KEY" .-> I["IDN_INVALID_TOKENS<br/>IDN_APP_REVOKED_EVENT"]
IDN_OAUTH_CONSUMER_SECRETS: an OAuth app can now have several secrets, each with its own expiry. The FK is onCONSUMER_KEY.- Revocation event tables (
IDN_APP_REVOKED_EVENT,IDN_SUBJECT_ENTITY_REVOKED_EVENT, and on the APIM sideAM_APP_REVOKED_EVENT,AM_SUBJECT_ENTITY_REVOKED_EVENT): 4.x revokes whole groups of JWTs ("everything for this app" or "everything for this user") by recording an event, instead of listing each token. IDN_INVALID_TOKENS: records revoked non-persisted tokens.- The rest are general Identity Server features (config store, CORS, remote config fetch, secrets, user functionality locks, OAuth user consent) and
SP_SHARED_APPfor organization-shared service providers. See the Identity Server tables.
Tables added and removed¶
Removed in 4.x (3)¶
| Table (3.2.0) | What it was | What replaces it in 4.x |
|---|---|---|
AM_LABELS |
Gateway / microgateway labels (LABEL_ID, NAME, TENANT_DOMAIN) |
Gateway environments (AM_GATEWAY_ENVIRONMENT). The name lives on in AM_LABEL, which is a different concept: a tag on an API. |
AM_LABEL_URLS |
Access URLs per label | VHosts (AM_GW_VHOST) |
AM_SUBSCRIPTION_KEY_MAPPING |
Access token ↔ subscription link | Nothing directly. Persisted API keys use AM_API_KEY. |
Added in 4.x (101)¶
Revisions, environments & deployment (17)
AM_REVISION, AM_API_REVISION_METADATA, AM_DEPLOYMENT_REVISION_MAPPING, AM_DEPLOYED_REVISION, AM_GATEWAY_ENVIRONMENT, AM_GW_VHOST, AM_GATEWAY_PERMISSIONS, AM_GW_INSTANCES, AM_GW_INSTANCE_ENV_MAPPING, AM_GW_REVISION_DEPLOYMENT, AM_GW_API_DEPLOYMENTS, AM_GATEWAY_TOKEN, AM_GW_PLATFORM_API_ARTIFACTS, AM_GW_PLATFORM_EVENT, AM_API_EXTERNAL_API_MAPPING, AM_API_ENVIRONMENT_KEYS, AM_ARTIFACT
API definition: endpoints, backends, service catalog (9)
AM_API_ENDPOINTS, AM_API_PRIMARY_EP_MAPPING, AM_BACKEND, AM_BACKEND_OPERATION_MAPPING, AM_API_SEQUENCE_BACKEND, AM_API_METADATA, AM_API_OPERATION_MAPPING, AM_SERVICE_CATALOG, AM_API_SERVICE_MAPPING
Operation & gateway policies (9)
AM_OPERATION_POLICY, AM_OPERATION_POLICY_DEFINITION, AM_COMMON_OPERATION_POLICY, AM_API_OPERATION_POLICY, AM_API_OPERATION_POLICY_MAPPING, AM_API_POLICY_MAPPING, AM_GATEWAY_POLICY_METADATA, AM_GATEWAY_POLICY_MAPPING, AM_GATEWAY_POLICY_DEPLOYMENT
Labels (2)
AM_LABEL, AM_API_LABEL_MAPPING
Keys & key managers (5)
AM_API_KEY, AM_API_KEY_API_MAPPING, AM_API_KEY_APPLICATION_MAPPING, AM_KEY_MANAGER_PERMISSIONS, AM_KEY_MANAGER_ALLOWED_ORGS
Revocation (2)
AM_APP_REVOKED_EVENT, AM_SUBJECT_ENTITY_REVOKED_EVENT
Tenants, organizations & users (12)
AM_ORGANIZATION_MAPPING, AM_SYSTEM_CONFIGS, UM_ORG, UM_ORG_ATTRIBUTE, UM_ORG_HIERARCHY, UM_ORG_PERMISSION, UM_ORG_ROLE, UM_ORG_ROLE_GROUP, UM_ORG_ROLE_PERMISSION, UM_ORG_ROLE_USER, UM_GROUP_UUID_DOMAIN_MAPPER, UM_HYBRID_GROUP_ROLE
AI / LLM APIs (3)
AM_LLM_PROVIDER, AM_LLM_PROVIDER_MODEL, AM_API_AI_CONFIGURATION
Governance (14)
GOV_RULESET, GOV_RULESET_CONTENT, GOV_RULESET_RULE, GOV_POLICY, GOV_POLICY_RULESET, GOV_POLICY_LABEL, GOV_POLICY_GOVERNABLE_STATE, GOV_POLICY_ACTION, GOV_ARTIFACT, GOV_REQUEST, GOV_REQUEST_POLICY, GOV_POLICY_RUN, GOV_RULESET_RUN, GOV_RULE_VIOLATION
Developer Portal content & webhooks (5)
AM_DEVPORTAL_API_CONTENT, AM_DEVPORTAL_API_REFERENCE, AM_DEVPORTAL_ORG_CONTENT, AM_WEBHOOKS_SUBSCRIPTION, AM_WEBHOOKS_UNSUBSCRIPTION
Operations & housekeeping (4)
AM_CORRELATION_CONFIGS, AM_CORRELATION_PROPERTIES, AM_TASK_LOCK, AM_TRANSACTION_RECORDS
Identity Server (IDN_, SP_) (19)
IDN_OAUTH_CONSUMER_SECRETS, IDN_INVALID_TOKENS, IDN_APP_REVOKED_EVENT, IDN_SUBJECT_ENTITY_REVOKED_EVENT, IDN_OAUTH2_USER_CONSENT, IDN_OAUTH2_USER_CONSENTED_SCOPES, IDN_CONFIG_TYPE, IDN_CONFIG_RESOURCE, IDN_CONFIG_ATTRIBUTE, IDN_CONFIG_FILE, IDN_CORS_ORIGIN, IDN_CORS_ASSOCIATION, IDN_REMOTE_FETCH_CONFIG, IDN_REMOTE_FETCH_REVISIONS, IDN_SECRET, IDN_SECRET_TYPE, IDN_USER_FUNCTIONALITY_MAPPING, IDN_USER_FUNCTIONALITY_PROPERTY, SP_SHARED_APP
Column changes on the core tables¶
These tables exist in both versions but changed shape. Tables not listed here, such as AM_SUBSCRIPTION, AM_SUBSCRIBER, AM_APPLICATION_KEY_MAPPING and AM_API_THROTTLE_POLICY, have identical columns in both versions.
| Table | Added in 4.x | Removed | Keys & other changes |
|---|---|---|---|
AM_API |
API_UUID, API_SUBTYPE, ORGANIZATION, GATEWAY_VENDOR, STATUS, LOG_LEVEL, IS_EGRESS, REVISIONS_CREATED, VERSION_COMPARABLE, SUB_VALIDATION, API_DISPLAY_NAME, INITIATED_FROM_GW |
— | Unique key gains ORGANIZATION. New unique API_UUID. The lifecycle STATUS is now copied into the table. |
AM_APPLICATION |
ORGANIZATION, SHARED_ORGANIZATION |
— | Unique (name, subscriber) becomes (name, subscriber, organization) |
AM_API_URL_MAPPING |
REVISION_UUID, LOG_LEVEL, DESCRIPTION, SCHEMA_DEFINITION |
— | One set of rows per revision. Still no FK to AM_API in either version. |
AM_API_PRODUCT_MAPPING |
REVISION_UUID |
— | Products are revisioned too |
AM_GRAPHQL_COMPLEXITY |
REVISION_UUID |
— | The unique (API_ID, TYPE, FIELD) was dropped because rows repeat per revision |
AM_API_CLIENT_CERTIFICATE |
KEY_TYPE, REVISION_UUID |
— | PK widened to (alias, tenant, key type, removed, revision) |
AM_GW_API_ARTIFACTS |
REVISION_ID |
GATEWAY_LABEL, GATEWAY_INSTRUCTION |
PK (GATEWAY_LABEL, API_ID) becomes (REVISION_ID, API_ID). ARTIFACT changes from LONGBLOB to MEDIUMBLOB. |
AM_GW_PUBLISHED_API_DETAILS |
API_TYPE |
— | — |
AM_KEY_MANAGER |
ORGANIZATION, TOKEN_TYPE, EXTERNAL_REFERENCE_ID |
TENANT_DOMAIN |
Unique (name, tenant domain) becomes (name, organization) |
AM_POLICY_SUBSCRIPTION |
CONNECTIONS_COUNT, TOTAL_TOKEN_COUNT, PROMPT_TOKEN_COUNT, COMPLETION_TOKEN_COUNT |
— | Adds connection limits (for streaming APIs) and AI token quotas. Still scoped by TENANT_ID. |
AM_POLICY_APPLICATION |
RATE_LIMIT_COUNT, RATE_LIMIT_TIME_UNIT |
— | Adds a burst-control (rate limit) setting |
AM_API_CATEGORIES |
ORGANIZATION |
TENANT_ID |
Unique becomes (name, organization) |
AM_API_DEFAULT_VERSION |
ORGANIZATION |
— | — |
AM_API_COMMENTS |
CREATED_BY, CREATED_TIME, UPDATED_TIME, PARENT_COMMENT_ID, ENTRY_POINT, CATEGORY |
COMMENTED_USER, DATE_COMMENTED |
Threaded replies via a new self-FK on PARENT_COMMENT_ID. COMMENT_ID shrinks to VARCHAR(64). |
AM_APPLICATION_ATTRIBUTES |
APP_ATTRIBUTE |
VALUE |
The value column was renamed (it's a BLOB in 4.x) |
AM_BLOCK_CONDITIONS |
BLOCK_CONDITION |
VALUE |
The value column was renamed |
AM_APPLICATION_REGISTRATION |
— | — | INPUTS changes from VARCHAR(1000) to LONGBLOB |
AM_CERTIFICATE_METADATA |
CERTIFICATE |
— | The certificate content is now stored in the table |
UM_TENANT |
UM_TENANT_UUID, UM_ORG_UUID |
— | New unique UM_TENANT_UUID |
IDN_OAUTH2_ACCESS_TOKEN |
CONSENTED_TOKEN |
— | — |
Smaller changes (not core to APIM): several IDN_*, CM_*, REG_RESOURCE_* and UM_SHARED_USER_ROLE tables gained a surrogate ID primary key, and a number of REG_* user columns widened from VARCHAR(31) to VARCHAR(255).
Deletes cascade more in 4.x¶
Nine foreign keys changed from RESTRICT (you can't delete the parent while children exist) to CASCADE (deleting the parent deletes the children):
flowchart LR
API[AM_API] -- "3.x RESTRICT → 4.x CASCADE" --> S[AM_SUBSCRIPTION]
APP[AM_APPLICATION] -- "3.x RESTRICT → 4.x CASCADE" --> S
APP -- "same" --> K[AM_APPLICATION_KEY_MAPPING]
APP -- "same" --> R[AM_APPLICATION_REGISTRATION]
The full list is:
AM_SUBSCRIPTION→AM_APIand →AM_APPLICATIONAM_APPLICATION_KEY_MAPPING→AM_APPLICATIONAM_APPLICATION_REGISTRATION→AM_APPLICATIONAM_API_LC_EVENT,AM_API_COMMENTS,AM_API_RATINGSandAM_SECURITY_AUDIT_UUID_MAPPING→AM_APIAM_GW_API_ARTIFACTS→AM_GW_PUBLISHED_API_DETAILS, which went from explicitNO ACTIONto the default
In 3.x, APIM's code had to delete the children first. In 4.x, the database does it for you.
How each core flow changed¶
| Flow | 3.x | 4.x | What changed |
|---|---|---|---|
| Setup & first user | 3.x | 4.x | Adds organizations (UM_ORG*, AM_ORGANIZATION_MAPPING) and AM_SYSTEM_CONFIGS. Gateway environments can be seeded as rows. |
| Create an API | 3.x | 4.x | AM_API gets API_UUID and ORGANIZATION. Endpoints, operation policies, metadata, service links and AI config can be written to their own tables instead of only the registry. |
| Create a new version | 3.x | 4.x | Same idea: a new AM_API row. The new version's revision-aware rows start again at 'Current API'. |
| Publish / deploy to the gateway | 3.x: publish | 4.x: deploy a revision | The biggest change. By default 3.x pushes straight to the gateways, so nothing goes to the database; artifacts per gateway label only appear when DB sync is on. 4.x creates AM_REVISION and stores its artifact, then deployment writes AM_DEPLOYMENT_REVISION_MAPPING and the gateway's acknowledgement in AM_GW_REVISION_DEPLOYMENT. |
| Change lifecycle state | 3.x | 4.x | The state is also copied to AM_API.STATUS. The FK from AM_API_LC_EVENT now cascades. |
| Create an API product | 3.x | 4.x | AM_API_PRODUCT_MAPPING is revision-aware, and products are deployed through revisions |
| Create an application | 3.x | 4.x | ORGANIZATION and SHARED_ORGANIZATION on AM_APPLICATION |
| Subscribe | 3.x | 4.x | AM_SUBSCRIPTION is unchanged, but deletes now cascade from both the API and the application |
| Generate keys | 3.x | 4.x | Key managers are per organization and have permissions and allowed-org lists. OAuth apps can have several secrets (IDN_OAUTH_CONSUMER_SECRETS). |
| Get a token & call the API | 3.x | 4.x | Persisted, hashed API keys (AM_API_KEY*) replace stateless-only API keys. AM_SUBSCRIPTION_KEY_MAPPING is gone. |
| Manage throttling policies | 3.x | 4.x | New limit types (connections, AI tokens, application burst). Still scoped by tenant. |
| Revoke & delete | 3.x | 4.x | Event-based bulk JWT revocation (*_REVOKED_EVENT) and more cascading deletes |
| Approval workflows | 3.x | 4.x | AM_WORKFLOWS is unchanged. Revision deployment can also be gated by a workflow. |
| Governance check | — | 4.x | New in 4.x |
| Create an AI API | — | 4.x | New in 4.x |
Behavior differences¶
Some differences between 3.2.0 and 4.7.0 don't show up in the table definitions. They're about how APIM uses the tables at runtime.
| Behaviour | 3.2.0 | 4.7.0 |
|---|---|---|
| Access tokens | Every token is stored in IDN_OAUTH2_ACCESS_TOKEN. Generating keys also issues and stores a first token. |
Application JWTs are not stored. Only opaque tokens, such as the portals' own, get a row. |
| Revoking a token | The row moves from IDN_OAUTH2_ACCESS_TOKEN to IDN_OAUTH2_ACCESS_TOKEN_AUDIT, and an AM_REVOKED_JWT row is added. |
Adds AM_REVOKED_JWT and IDN_INVALID_TOKENS rows. |
| API keys | Self-contained JWTs, so there's nothing in the database. | Stored as a SHA-256 hash in AM_API_KEY, linked to the application by UUID. |
| Resource scopes | Only in IDN_OAUTH2_SCOPE. AM_SCOPE stays empty. |
In AM_SCOPE and IDN_OAUTH2_SCOPE. |
| API product resources | AM_API_PRODUCT_MAPPING points straight at the underlying API's existing URL mapping row. |
The URL mapping row is copied, and the copy stores the product's API_ID in REVISION_UUID. |
| Gateway artifacts in the database | None by default. Database sync is opt-in. | Written to AM_GW_API_ARTIFACTS when a revision is created. The gateway's acknowledgement goes to AM_GW_REVISION_DEPLOYMENT. |
| Key manager reference | KEY_MANAGER holds the name (Resident Key Manager). |
KEY_MANAGER holds the key manager's UUID. |
| Governance | Doesn't exist. | Every API create, update or revision queues a governance run (GOV_REQUEST). Each run's results replace the previous run's. |
Both versions agree on these:
- AM_SUBSCRIBER and a DefaultApplication are created on the first Developer Portal action.
- AM_APPLICATION_REGISTRATION is written even when no approval workflow is configured.
- Calling an API writes nothing to the database.
- APIM's code refuses (HTTP 409) to delete an API that has active subscriptions, whatever the foreign keys say.