papp_install
Install one selected feature on an existing channel when current prerequisites and all relevant zero-cost conditions are confirmed. Read papps_get first and select the returned feature code and pricing-model identity.
| Input | Contract |
|---|---|
requestId |
Required, 8–80 ASCII letters/digits/underscores/hyphens; stable for the original request |
channelCode |
Required selected-channel code, not . or .. |
expectedRevision |
Required 64 lowercase hexadecimal characters copied from get |
pAppCode |
Required selected feature code; ASCII letters/digits/underscores |
ppmid |
Required nonempty pricing-model ID from that feature and current plan class |
dryRun |
Optional boolean, default false |
{
"requestId":"papp-install-example-001",
"channelCode":"selected-channel-code",
"expectedRevision":"0000000000000000000000000000000000000000000000000000000000000000",
"pAppCode":"A00003",
"ppmid":"pricing-model-from-get",
"dryRun":true
}
Replace all illustrative identities and the zero revision from one current get result. The feature is not guaranteed to be available or free in another channel. Unknown fields are rejected. Use OWNER or a selected-channel DELEGATEE with MANAGE_P_APP_INSTALL_UNINSTALL; the hosted resource must admit the exact channel.
A fresh call compares the whole snapshot revision, checks store visibility/release, existing installation, dependencies, plan, account type and selected pricing. It does not install missing parents automatically. Restricted account-allowlist features, an unknown required business-account type, plan restrictions and unconfirmed fees require the corresponding human action. Already installed features are not installed again or repriced by this tool.
Zero cost means explicit zero-valued installation, monthly and usage prices for the actual channel currency. Missing prices, currency mismatch, nonzero values or an unsupported amount representation are not inferred free. The pricing model must belong to the feature and match the current plan class; its FREE name/class alone proves nothing. Blocked or paid installation returns an error or action_required with no install request. See costs and prerequisites.
A fresh successful dry run returns PLAN_READY, action/install target, pricing ID, planned steps and writesPerformed:false, without a new task or install/refresh. An existing matching task's dry run returns its saved phase/task ID and performs no fresh catalog/revision/eligibility comparison. A plan is not installation evidence.
With dryRun:false, the workflow saves the original task, rechecks the pre-dispatch snapshot and sends one necessary install POST. It tracks channel credential refresh before installed-list/detail verification. Completion requires exactly one new installed row for the requested code, preservation of all previously installed rows, the requested active current pricing model, no scheduled next pricing, unchanged plan/currency/account type, and stable final snapshot reads.
Success uses PAPP_INSTALLED and includes installed rows, revision, task ID/type and verification.method:installed_list_detail_and_credential_refresh. It does not prove visitor functionality or operate content inside the installed feature. The recovery contract distinguishes a definitively rejected prepared request from an uncertain sent one; an unsent credential refresh can still run during resume. Completed results are historical.
Use status and resume with taskType:"papp-lifecycle" and the same task ID. Never create a replacement request merely to bypass an unknown install outcome. Changing an installed feature's pricing uses the human handoff.
Saved record identity
Stored task IDs must match the requested lookup key. An intact task copied under
a different key, or a present JSON null/false/zero/empty-string record, returns
TASK_STATE_UNVERIFIED before context/business calls. Preserve both the original
record and the requested file for inspection; do not replace or delete them to
bypass uncertainty. Only an actually absent file means no task.
An existing matching dry-run returns its saved plan with historical:true,
replayed:true, and verification.currentStateVerified:false. It does not recheck
current install/removal eligibility. Follow nextStep to papps_get for the exact
original channel and feature before planning further changes. The journal is
unchanged and no installation, removal or credential refresh is sent by this plan.
Saved record consistency
Before using an existing task, the workflow checks its original input fingerprint,
before-state revision, allowed progress/refresh/checkpoint combinations and any
stored completion. A completed result must match the original channel, feature,
task, pricing/removed target and preserved installed rows. Inconsistency returns
TASK_STATE_UNVERIFIED before context/business calls and leaves the record intact.
Preserve it for inspection rather than repairing fields or starting replacement
work. This validates consistency, not cryptographic authenticity or current server
state. Historical completion still requires a fresh get for current values.
Detail pricing evidence
An installed-list row may omit pricing or contain null while the detail response confirms valid active pricing. Those list values remain unchanged. New tasks keep a separate internal detail-verification receipt and require it for completed installation recovery. The receipt binds the observed installed ID, feature code, requested active price and absence of a scheduled next price. Legacy histories without that receipt retain their existing verified-method metadata and target/ preservation checks; no receipt or list pricing is invented. Historical replay is not a current detail read. Invalid detail identity/pricing cannot confirm a new installation, and uncertain effects are never resent.
Inputs
| Field | Required here | Contract |
|---|---|---|
app |
Yes | string; min length 1; max length 100; The feature: its code from papps_get (for example C00001) or its exact store name. |
pricingModel |
Yes | string; min length 1; max length 200; The ppmid of the chosen pricing model from papps_get. |
confirmToken |
No | string; pattern ^ct[a-f\d]{32}$; The confirmToken from this tool's preview result. Omit it to preview; repeat the same input with it to execute. |
irreversibleConfirmed |
No | true; true only after the person confirmed again, when the preview has requiresReconfirmation: the action cannot be undone. |