Move resources into, between or out of app environments
const url = 'https://opfield.example.com/api/apps/members/place';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"target":{"appId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","environmentId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0"},"members":[{"type":"container","id":"example","nodeId":"2489E9AD-2EE2-8E00-8EC9-32D5F69181C0","resourceKey":"example"}]}'};
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://opfield.example.com/api/apps/members/place \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "target": { "appId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "environmentId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0" }, "members": [ { "type": "container", "id": "example", "nodeId": "2489E9AD-2EE2-8E00-8EC9-32D5F69181C0", "resourceKey": "example" } ] }'Target {appId, environmentId} imports or moves each member into that environment; target null takes them out of their app (top level of their lists). Members: {type, id} (deployment, compose, database, storage, route, domain, pages, certificate, logging by id) or {type: container, id: name, nodeId}. Needs apps:env:manage on the target environment and on the environment a member leaves, plus the edit permission of each member. Refused per member: system routes and the Opfield public URL route (ROUTE_NOT_PLACEABLE), system certificates (CERTIFICATE_NOT_PLACEABLE), system domains (DOMAIN_NOT_PLACEABLE), a domain or route hostname outside the domain allowlist of the target environment (APP_DOMAIN_NOT_ALLOWED), a node the target environment does not allow (APP_NODE_NOT_ALLOWED), no permission (FORBIDDEN), unknown member (NOT_FOUND), a member of an environment isolated by the kill switch (APP_ISOLATED; an isolated target refuses the whole request with 409 APP_ISOLATED). Shut-down environments take moves both ways; Start still starts a member moved out that ran at shutdown. Partial success: placed and refused are listed.
Authorizations
Section titled “Authorizations”Request Bodyrequired
Section titled “Request Bodyrequired”JSON request body
object
object
object
Responses
Section titled “Responses”Successful response
object
Resource object. Exact fields depend on the endpoint.
object
Example
{ "data": { "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Example resource", "createdAt": "2024-01-01T12:00:00.000Z", "updatedAt": "2024-01-01T12:30:00.000Z" }}Bad request
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "VALIDATION_ERROR", "message": "Request validation failed", "details": [ { "path": [ "name" ], "message": "Required" } ]}Authentication required
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "UNAUTHORIZED", "message": "Authentication required"}Forbidden
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "FORBIDDEN", "message": "Insufficient permissions"}Not found
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "NOT_FOUND", "message": "Resource not found"}Conflict
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "CONFLICT", "message": "Resource already exists"}Unprocessable entity
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "UNPROCESSABLE_ENTITY", "message": "Request could not be processed"}Internal server error
object
Error code
Human-readable error message
Additional error details
Example
{ "code": "INTERNAL_ERROR", "message": "Internal server error"}