Read the installation result idempotently
const url = 'https://example.com/api/apps/installation-intents/9f2b7c14-59d3-4f7a-b8e1-2a6c05d4e731/status';const options = { method: 'POST', headers: {'Content-Type': 'application/json'}, body: '{"assertion":"eyJhbGciOiJFZERTQSIsImtpZCI6InYxIn0.eyJpc3MiOiJhY21lLWNoZWNrb3V0LWJvdCIsInN1YiI6ImFjbWUtY2hlY2tvdXQtYm90IiwiYXVkIjoiaHR0cHM6Ly9hcGkud2FtcC5kZXYvYXBpL2FwcHMvaW5zdGFsbGF0aW9uLWludGVudHMiLCJpYXQiOjE3ODYxOTQ0ODAsImV4cCI6MTc4NjE5NDc4MH0.Tz8Yh1mKqNw5RbLp2Vc7dJfXsEgO0uA4iC6nMoBrPlD"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://example.com/api/apps/installation-intents/9f2b7c14-59d3-4f7a-b8e1-2a6c05d4e731/status \ --header 'Content-Type: application/json' \ --data '{ "assertion": "eyJhbGciOiJFZERTQSIsImtpZCI6InYxIn0.eyJpc3MiOiJhY21lLWNoZWNrb3V0LWJvdCIsInN1YiI6ImFjbWUtY2hlY2tvdXQtYm90IiwiYXVkIjoiaHR0cHM6Ly9hcGkud2FtcC5kZXYvYXBpL2FwcHMvaW5zdGFsbGF0aW9uLWludGVudHMiLCJpYXQiOjE3ODYxOTQ0ODAsImV4cCI6MTc4NjE5NDc4MH0.Tz8Yh1mKqNw5RbLp2Vc7dJfXsEgO0uA4iC6nMoBrPlD" }'The same App publisher may read pending, authorized, or expired state. An authorized installation id remains readable until the result window expires, so response loss is safe to retry.
Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”A UUID identifying one Cloud resource; Session, Turn, Publication and Merge ids are minted by the caller so an ambiguous retry addresses the same durable command instead of creating a second one.
Example
9f2b7c14-59d3-4f7a-b8e1-2a6c05d4e731The installation intent id returned by POST /api/apps/installation-intents; only the App publisher that created it can read it
Request Bodyrequired
Section titled “Request Bodyrequired”object
Example
{ "assertion": "eyJhbGciOiJFZERTQSIsImtpZCI6InYxIn0.eyJpc3MiOiJhY21lLWNoZWNrb3V0LWJvdCIsInN1YiI6ImFjbWUtY2hlY2tvdXQtYm90IiwiYXVkIjoiaHR0cHM6Ly9hcGkud2FtcC5kZXYvYXBpL2FwcHMvaW5zdGFsbGF0aW9uLWludGVudHMiLCJpYXQiOjE3ODYxOTQ0ODAsImV4cCI6MTc4NjE5NDc4MH0.Tz8Yh1mKqNw5RbLp2Vc7dJfXsEgO0uA4iC6nMoBrPlD"}Responses
Section titled “Responses”Current installation intent state
Envelope returned when an installation handoff is created or polled.
object
Always true on this response; a refused request returns an HTTP error status with an error code instead
Current state of the handoff, safe to poll on an interval until it reports authorized or expired
object
The intent id, which is itself the unguessable invitation — treat it and the authorize URL as secrets
pending until a human approves, authorized once an organization has installed the App, expired once expiresAt has passed; polling never consumes an authorized result
When this handoff stops being usable — 15 minutes after creation while pending, extended to a 1-hour result window once authorized
Account Center URL to hand to a human so they can pick the organization and approve the requested capabilities
Present only while status is authorized; the durable installation id to persist and name in every later token exchange
Example
{ "success": true, "intent": { "id": "2f9c8d31-0b64-4a72-9e58-c31d7a6f0be4", "status": "authorized", "expiresAt": "2026-08-12T10:02:00Z", "authorizeUrl": "https://account.wamp.dev/install/2f9c8d31-0b64-4a72-9e58-c31d7a6f0be4", "installationId": "e3f7b219-6c40-4a8e-b591-07d2c48f3a65" }}Malformed request
Failure body returned with every non-2xx JSON response; branch on the machine code, never on prose or on the HTTP status alone.
object
Stable machine code
The installation capability the presented credential lacks, returned with insufficient_scope so an integrator knows exactly which capability to request
Advisory seconds to wait before retrying; returned on rate-limit denials, where the Retry-After header carries the same value
Example
{ "error": "invalid_request"}Missing, expired or wrong-audience bearer
Failure body returned with every non-2xx JSON response; branch on the machine code, never on prose or on the HTTP status alone.
object
Stable machine code
The installation capability the presented credential lacks, returned with insufficient_scope so an integrator knows exactly which capability to request
Advisory seconds to wait before retrying; returned on rate-limit denials, where the Retry-After header carries the same value
Example
{ "error": "unauthorized"}The resource is missing or inaccessible
Failure body returned with every non-2xx JSON response; branch on the machine code, never on prose or on the HTTP status alone.
object
Stable machine code
The installation capability the presented credential lacks, returned with insufficient_scope so an integrator knows exactly which capability to request
Advisory seconds to wait before retrying; returned on rate-limit denials, where the Retry-After header carries the same value
Example
{ "error": "cloud_session_not_found"}The pre-authentication edge budget or durable human-membership/App-installation budget is exhausted
Failure body returned with every non-2xx JSON response; branch on the machine code, never on prose or on the HTTP status alone.
object
Stable machine code
The installation capability the presented credential lacks, returned with insufficient_scope so an integrator knows exactly which capability to request
Advisory seconds to wait before retrying; returned on rate-limit denials, where the Retry-After header carries the same value
Example
{ "error": "cloud_rate_limit_exceeded", "retryAfterSeconds": 3}Headers
Section titled “Headers”IETF HTTPAPI structured quota policy
IETF HTTPAPI structured current service limit