Application Integration Authoring
GoogleOfficialPublished by Google
- Skill
- Tool integration
- Automation and integrations
- Apache-2.0
- Low risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured approach to managing the lifecycle of Google Cloud Application Integration workflows. It enables developers to interact with the integration platform programmatically, facilitating tasks such as listing integrations, downloading version definitions as JSON, uploading new drafts, and promoting workflows across different environments. It emphasizes secure practices, such as using authentication profiles instead of plain-text config variables, and provides a clear path for CI/CD integration by leveraging the REST API and Python discovery client.
What it does
- Lists and searches existing integrations and versions within a Google Cloud region.
- Downloads integration versions as portable JSON for source control and auditing.
- Uploads JSON definitions to create or update integration drafts.
- Publishes draft versions to make them active and capable of serving traffic.
- Invokes integrations synchronously or schedules them for asynchronous execution.
- Automates the promotion of integration versions across development, staging, and production environments.
When to use it
- When you need to manage integration lifecycles outside of the Google Cloud Console.
- When implementing CI/CD pipelines for automated deployment of integration workflows.
- When you need to export integration configurations for version control.
- When you need to programmatically trigger integrations via API or schedule them.
Advantages
- Enables repeatable, version-controlled deployment of complex integration workflows.
- Supports environment-specific parameterization for seamless promotion across projects.
- Provides granular control over integration states, from draft to active.
- Facilitates programmatic testing and execution of workflows.
Usage examples
- “List all integration versions for the order-webhook integration in us-central1.”
- The agent retrieves and displays a list of versions for the specified integration, ordered by their last modification time.
- “Promote the latest draft of the order-webhook integration to the production project.”
- The agent downloads the JSON from the source, updates the run-as service account for the target environment, uploads it to the production project, and publishes the new version.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/google/application-integration-authoring/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip application-integration-authoring.zip -d .agents/skills
Documentation by Google
Application Integration Authoring
Google Cloud Application Integration workflows are authored, versioned, published, and executed programmatically through the REST API (https://integrations.googleapis.com/v1/...) or the discovery-based Google API Python client (googleapiclient.discovery.build("integrations", "v1")).
There is no gcloud integrations command group, no Google-managed MCP server for Application Integration, and no documented Terraform resource for integrations or versions. Use gcloud only for authentication, enabling APIs, and IAM bindings. Use Terraform only for region provisioning (google_integrations_client), authentication profiles (google_integrations_auth_config), and Integration Connectors (google_integration_connectors_connection).
For initial project setup, region provisioning, and IAM role definitions, use the application-integration-basics skill. For diagnosing failed or stuck runs, execution logs, and quota errors, use the application-integration-troubleshooting skill.
Attribution
MUST READ: Before executing any gcloud command, REST API call, or Python
discovery-client call, you MUST read
Usage Attribution. For commands executed directly
in the terminal (never in generated scripts, Terraform, ADK agents, or user
code), prefix gcloud with
CLOUDSDK_METRICS_REQUEST_ATTRIBUTION="agent-skills/1.0 (skill:application-integration-authoring)"
and add agent-skills/1.0 (skill:application-integration-authoring) to the
User-Agent header of curl requests.
Safety and Confirmation Rules
Read-only operations run freely:
integrations.list,integrations:search,versions.list,versions.get,versions:download,authConfigs.list, andexecutions.list.Confirm before any state change or execution: Before creating, uploading, patching, publishing, unpublishing, testing, executing, scheduling, or deleting an integration or version, or modifying IAM or auth configs, show the exact command and payload to the user and get explicit confirmation.
Host changes require approval. Before installing packages (
pip install) or changing global gcloud or credential state (gcloud config set ...such asauth/impersonate_service_account,gcloud auth application-default login/set-quota-project), show the exact command and wait for the user's approval.Never store secrets in config variables: Config variables (
CONFIG_*) are stored and exported in plain text. Always use authentication profiles (projects.locations.authConfigs) or the Secret Manager access task for credentials.
Prerequisites Checklist
Install Google Cloud SDK: Follow Install the gcloud CLI if
gcloudis not installed.Billing and project: Ensure the Google Cloud project has an active billing account attached (required even when usage stays within the free tier), then set the target project (changes global gcloud state; get the user's approval first):
gcloud config set project PROJECT_IDEnable required APIs:
gcloud services enable integrations.googleapis.com connectors.googleapis.com secretmanager.googleapis.comProvision the region: Application Integration is regional: confirm the target region is supported on Application Integration locations and use
us-central1as a well-supported default when the user has no preference. The region is theLOCATIONin every REST path; nogclouddefault-region setting applies to Application Integration. The targetLOCATIONmust be provisioned via the Cloud console orPOST .../clients:provisionbefore authoring integrations (seeapplication-integration-basics).Authenticate:
For
curl: rungcloud auth login(changes host or credential state; get the user's approval first) and pass-H "Authorization: Bearer $(gcloud auth print-access-token)".For the Python client (install with
pip install "google-api-python-client>=2.100.0,<3" "google-auth>=2.20.0,<3"): rungcloud auth application-default loginandgcloud auth application-default set-quota-project PROJECT_ID(or setGOOGLE_APPLICATION_CREDENTIALSfor a service account) (changes host or credential state; get the user's approval first).For service account impersonation: run
gcloud config set auth/impersonate_service_account SA_EMAIL(requiresroles/iam.serviceAccountTokenCreator) (changes host or credential state; get the user's approval first).
Verify IAM roles:
Create, upload, or edit drafts:
roles/integrations.integrationEditor(coversversions:upload, which needsintegrations.integrationVersions.create, andversions:publish)Publish or unpublish:
roles/integrations.integrationDeployerorroles/integrations.integrationEditor(roles/integrations.integrationDeployeralone can publish an existing version but cannot upload viaversions:upload), plusroles/integrations.serviceAgentgranted to the Application Integration service agent (service-PROJECT_NUMBER@gcp-sa-integrations.iam.gserviceaccount.com)Invoke integrations:
roles/integrations.integrationInvokerAct as the run-as service account: integrations created on or after October 15, 2026 with any trigger other than an API or Private trigger (for example Schedule, Cloud Scheduler, Cloud Pub/Sub, Salesforce, or Connector Event; Private triggers are exempt like API triggers, so a sub-integration whose only trigger is Private can be published without
runAsServiceAccount) cannot be tested or published unlessrunAsServiceAccountis set (and region governance requires it for all integrations); wheneverrunAsServiceAccountis set, the user publishing or testing the version needsroles/iam.serviceAccountUseron it (and at runtime, the invoking caller or trigger service account needsroles/iam.serviceAccountUseron it).
Decision Flow
| Goal | Action | Endpoint / Method |
|---|---|---|
| Inspect existing integrations in a region | List integrations, then list versions | GET .../integrations then GET .../versions |
| Export an integration version to source control | Download version JSON | GET .../versions/VERSION_ID:download?fileFormat=JSON |
Create an integration or add a new DRAFT version from JSON | Upload version JSON (creates the integration if it does not exist, or adds a new DRAFT version; still needs :publish) | POST .../integrations/INTEGRATION_NAME/versions:upload |
| Create a brand-new integration and fail on a name clash | Create first DRAFT version with newIntegration=true (returns ALREADY_EXISTS if INTEGRATION_NAME already exists) | POST .../integrations/INTEGRATION_NAME/versions?newIntegration=true |
Edit an existing DRAFT version | Check lockHolder, then patch or upload | PATCH .../versions/VERSION_ID?updateMask=... |
Edit an ACTIVE (published) integration | Upload or create a new DRAFT version | POST .../integrations/INTEGRATION_NAME/versions:upload |
| Externalize environment-specific URLs or IDs | Define CONFIG_<NAME> and supply at publish | integrationConfigParameters + versions:publish |
| Store API keys, OAuth credentials, or certs | Create an authentication profile | POST .../authConfigs |
| Test an integration before production | Publish to a non-production project and invoke :execute | POST .../versions/VERSION_ID:publish then POST .../integrations/INTEGRATION_NAME:execute |
Deploy a DRAFT to serve live traffic | Publish version with configParameters | POST .../versions/VERSION_ID:publish |
| Invoke a published integration synchronously | Call :execute with api_trigger/TRIGGER_NAME | POST .../integrations/INTEGRATION_NAME:execute |
| Invoke a published integration asynchronously | Call :schedule with scheduleTime | POST .../integrations/INTEGRATION_NAME:schedule |
| Promote a version across projects (CI/CD) | Download JSON -> Upload to target -> Publish | :download -> :upload -> :publish |
See references/rest-api-cheatsheet.md for full request parameters, query filters, and IAM permissions for each method.
Core Authoring Workflow
1. List Integrations and Download a Version
List integrations in LOCATION and list versions for a specific INTEGRATION_NAME:
TOKEN="$(gcloud auth print-access-token)"
# List integrations in the region
curl -sS -H "Authorization: Bearer ${TOKEN}" \
"https://integrations.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/integrations?pageSize=50"
# List versions (ordered by most recently modified)
curl -sS -H "Authorization: Bearer ${TOKEN}" \
"https://integrations.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/integrations/INTEGRATION_NAME/versions?orderBy=last_modified_time%20desc"Download a specific version (VERSION_ID is the UUID at the end of the version's name field) as portable JSON:
curl -sS -H "Authorization: Bearer ${TOKEN}" \
"https://integrations.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/integrations/INTEGRATION_NAME/versions/VERSION_ID:download?fileFormat=JSON" \
| jq -r '.content' > integration-version.json2. Understand the IntegrationVersion Structure
An IntegrationVersion JSON object contains four primary arrays and version-level settings:
triggerConfigs: Entry points that start the workflow. Each entry requires a uniquetriggerNumber, plustriggerType(such asAPIorPRIVATE_TRIGGER), optionaltriggerId(auto-generated frompropertiesif omitted; for API triggers:api_trigger/TRIGGER_NAME), andstartTaskspointing to the firsttaskId.taskConfigs: Units of work. Each entry needstask(the task type, such asEmailTaskin the public upload sample, orFieldMappingTaskin a discovery enum description), a uniquetaskId,parameters,nextTasks, and optionalfailurePolicyorerrorCatcherId.integrationParameters: Input, output, and transient variables (key,dataTypesuch asSTRING_VALUEorJSON_VALUE,inputOutputTypeofIN,OUT,IN_OUT, orIN_OUT_TYPE_UNSPECIFIED, anddefaultValue).integrationConfigParameters: Environment-specific config variable definitions (parameterwith key`CONFIG_<NAME>`andparameter.defaultValue; a top-levelvaluein uploaded or created draft JSON is discarded, so per-environment values go inconfigParametersat publish).runAsServiceAccount: Dedicated user-managed service account email. When set and no authentication profile (authConfig) is configured on the task, it is used to generate the auth token for Connector (Connectors), REST (Call REST Endpoint), and Cloud Function tasks; an authentication profile configured on the task takes precedence overrunAsServiceAccount.
Always use triggerConfigs, taskConfigs, and integrationParameters. Never use triggerConfigsInternal, taskConfigsInternal, or integrationParametersInternal because they are deprecated. See references/integration-version-json.md for field schemas, ValueType shapes, and a minimal IntegrationVersion JSON template.
3. Create or Upload a DRAFT Version
Each integration allows up to 100 versions and 100 tasks, and INTEGRATION_NAME can be at most 64 characters. Calling versions:upload creates a new DRAFT version—creating the integration automatically if INTEGRATION_NAME does not exist yet, or adding the next DRAFT version if it already exists (for example, uploading onto version 5 creates version 6). The uploaded version is in DRAFT state and still requires versions:publish to serve traffic. Use POST .../versions?newIntegration=true (passing an IntegrationVersion JSON body) only when you explicitly want the call to fail with ALREADY_EXISTS if INTEGRATION_NAME already exists.
# Upload integration-version.json as a new DRAFT version
PAYLOAD="$(jq -n --rawfile content integration-version.json '{content: $content, fileFormat: "JSON"}')"
curl -sS --fail-with-body -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d "${PAYLOAD}" \
"https://integrations.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/integrations/INTEGRATION_NAME/versions:upload"Capture the new VERSION_ID from .integrationVersion.name in the response (projects/PROJECT_ID/locations/LOCATION/integrations/INTEGRATION_NAME/versions/VERSION_ID).
4. Version States and Edit-Lock Rules
| State | Meaning | Editable? | Can Serve Triggers? |
|---|---|---|---|
DRAFT | Version actively being edited; its edit lock is held by its author (lockHolder email) for 15 minutes from the last update | Yes (only by lockHolder) | No |
ACTIVE | Published version serving live traffic | No | Yes |
SNAPSHOT | Prior draft (when another author takes over in the console) or unpublished version (PREVIOUSLY_PUBLISHED) | No | No |
ARCHIVED | Soft-deleted via versions.delete (no undelete; listed as DELETED on the Integration versions documentation page) | No | No |
Edit-lock enforcement: A
DRAFTversion's edit lock is held by its author (lockHolder). Callingversions:publishorversions.deleteon aDRAFTfails if the caller is not thelockHolder(versions:publishandversions.deleterelease any existing lock when they succeed).No v1 lock-takeover API:
takeoverEditLockdoes not exist onprojects.locations.integrations.versionsin the v1 REST API (it only exists onversions.testCases). If aDRAFTis locked by another user, wait 15 minutes fromupdateTimefor the lock to expire automatically, or click Take Over in the Cloud console (which converts the existing draft toSNAPSHOTand creates a newDRAFT).
5. Config Variables vs Authentication Profiles
Config variables (
CONFIG_<NAME>): Use for non-secret environment values (backend hostnames, Pub/Sub topics, connection names). Define them inintegrationConfigParameterson the draft (putting any default inparameter.defaultValue, because a top-levelvalueon a draft is discarded) and pass their per-environment values inconfigParameterswhen callingversions:publish. Gotcha: Keys inconfigParametersat publish must exactly match a key inintegrationConfigParameters, backticks included (for example,"`CONFIG_target_url`"); unknown keys are silently ignored, not rejected (versions:publishreturns 200 and the default stays). Config variables cannot configure Integration Connectors entity operations or actions.Authentication profiles (
authConfigs): Use for API keys, OAuth 2.0 credentials, JWTs, OIDC tokens, SSL/TLS certificates, and service accounts. Auth profiles are regional resources (projects/PROJECT_ID/locations/LOCATION/authConfigs/AUTH_CONFIG_ID) and are not included when you download an integration version. Create them in each target project viaPOST .../authConfigsor Terraformgoogle_integrations_auth_config.
6. Test, Publish, and Unpublish
Recommended testing path: Test integrations by publishing the version in a non-production project (
versions:publish) and invokingintegrations:executethere.Note on
integrations:test: The v1 REST API includesPOST .../integrations/INTEGRATION_NAME:testfor testing aDRAFT, which requiresTestIntegrationsRequest.clientId("Required. This is used to identify the client on whose behalf the event will be executed."), but the public documentation does not specify what value to pass. Do not invent aclientIdvalue; publish to a non-production project and call:executeinstead. (Draft testing also cannot runApproval,Suspend, orTimertasks, and Call REST Endpoint authentication profile changes only take effect after publishing.)
Publish (
versions:publish): Deploys the version asACTIVEand releases any edit lock (fails if the version is alreadyACTIVEorARCHIVED, or if it is aDRAFTwhoselockHolderdiffers from the caller). Any previouslyACTIVEversion is automatically unpublished, and dependent services switch to the newly published version.Gotcha: Publishing a new version automatically cancels all suspended executions of the previous version.
Gotcha: Due to eventual consistency, the previous version can continue running for up to 10 minutes after a new version is published.
Unpublish (
versions:unpublish): Moves theACTIVEversion toSNAPSHOT(taggedPREVIOUSLY_PUBLISHED; fails if the version is notACTIVE) and stops triggers and dependent services.
# Publish VERSION_ID and supply config variable values (keys must exactly match integrationConfigParameters keys, backticks included; unknown keys are silently ignored)
curl -sS --fail-with-body -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{"configParameters": {"`CONFIG_backend_url`": "https://api.example.com"}}' \
"https://integrations.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/integrations/INTEGRATION_NAME/versions/VERSION_ID:publish"7. Execute (Sync) vs Schedule (Async)
Only an ACTIVE (published) version can be invoked via execute or schedule. For API triggers, triggerId is always api_trigger/TRIGGER_NAME (where TRIGGER_NAME is at most 64 characters). Passing - as INTEGRATION_NAME in execute runs all published integrations in that region that share the triggerId.
| Method | Mode | Max Timeout | Max API Input | Key Request Fields | Key Response Fields |
|---|---|---|---|---|---|
integrations:execute | Sync | 2 minutes | 8 MB | triggerId, inputParameters, requestId, doNotPropagateError | executionId, outputParameters, parameters |
integrations:schedule | Async | 10 minutes | Not documented | triggerId, scheduleTime (RFC 3339), inputParameters, requestId, userGeneratedExecutionId | executionInfoIds[] |
Reading
outputParametersandexecutionId: InExecuteIntegrationsResponse,executionIdidentifies the run, andoutputParametersis a JSON object of output variables (system-generated keys such as`ExecutionId`are wrapped in backticks).HTTP 200 does not prove every task succeeded: If
doNotPropagateErroristrue, or a task uses failure policyIGNOREorNONEwith an alternate path, the HTTP call returns200 OKeven when a task failed. Always verify the execution record viaexecutions.list?filter=execution_id="EXECUTION_ID"(checkingexecutionDetails.state, each task'staskExecutionState, andErrorInfoinExecution.responseParameters; whendoNotPropagateErroristrue, errors are also returned in event parameters asPostWithTriggerIdExecutionException). Do not rely on the legacy/deprecatedexecutionFailedfield.
See references/triggers-and-execution.md for all trigger types, ValueType input formatting, OpenAPI spec generation, and suspension lifting and approval resolution.
End-to-End Version and API Workflow Examples
In downloaded and uploaded IntegrationVersion JSON, an EmailTask uses four customer-visible parameter keys inside taskConfigs[].parameters: "To" (stringArray of recipient addresses), "Subject" (stringValue), "BodyFormat" (stringValue, such as "PLAIN_TEXT"), and "TextBody" (stringValue). Both runnable examples below also set "runAsServiceAccount": "RUN_AS_SA" (replace RUN_AS_SA with your dedicated service account email, such as order-workflow-sa@PROJECT_ID.iam.gserviceaccount.com; projects with governance require a run-as service account to publish, and the caller needs roles/iam.serviceAccountUser on it). Executing an EmailTask sends a real email, so always confirm the recipient address (RECIPIENT_EMAIL) and each state-changing command (upload, publish, and execute) with the user before running.
Example 1: Upload, Publish, and Invoke Workflow with curl
This example uploads a runnable IntegrationVersion JSON (versions:upload creates INTEGRATION_NAME automatically if it does not exist yet, or adds a new DRAFT version if it does), publishes the draft, and invokes :execute. The caller must hold roles/iam.serviceAccountUser on RUN_AS_SA (projects with governance require a run-as service account to publish). Because EmailTask sends real email, confirm RECIPIENT_EMAIL and get user confirmation before running the upload, publish, and execute calls.
set -euo pipefail
export PROJECT_ID="my-project"
export LOCATION="us-central1"
export INTEGRATION_NAME="order-webhook"
export TRIGGER_NAME="order_api"
TOKEN="$(gcloud auth print-access-token)"
BASE_URL="https://integrations.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}"
# 1. Write an IntegrationVersion JSON file (set RUN_AS_SA and confirm RECIPIENT_EMAIL with user first; caller needs roles/iam.serviceAccountUser on RUN_AS_SA)
cat <<'EOF' > /tmp/version.json
{
"description": "API-triggered order notification integration",
"runAsServiceAccount": "RUN_AS_SA",
"triggerConfigs": [
{
"label": "API Trigger",
"triggerType": "API",
"triggerNumber": "1",
"triggerId": "api_trigger/order_api",
"properties": {"Trigger name": "order_api"},
"startTasks": [{"taskId": "1"}]
}
],
"taskConfigs": [
{
"task": "EmailTask",
"taskId": "1",
"displayName": "Send Email",
"taskExecutionStrategy": "WHEN_ALL_SUCCEED",
"parameters": {
"To": {"key": "To", "value": {"stringArray": {"stringValues": ["RECIPIENT_EMAIL"]}}},
"Subject": {"key": "Subject", "value": {"stringValue": "Order notification for $orderId$"}},
"BodyFormat": {"key": "BodyFormat", "value": {"stringValue": "PLAIN_TEXT"}},
"TextBody": {"key": "TextBody", "value": {"stringValue": "Processing order $orderId$."}}
}
}
],
"integrationParameters": [
{
"key": "orderId",
"dataType": "STRING_VALUE",
"inputOutputType": "IN_OUT",
"defaultValue": {"stringValue": "ORD-0000"}
}
]
}
EOF
# 2. Upload as a new DRAFT version — creates INTEGRATION_NAME if it does not exist yet (confirm with user first)
UPLOAD_BODY="$(jq -n --rawfile content /tmp/version.json '{content: $content, fileFormat: "JSON"}')"
VERSION_NAME="$(curl -sS --fail-with-body -X POST \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d "${UPLOAD_BODY}" \
"${BASE_URL}/integrations/${INTEGRATION_NAME}/versions:upload" \
| jq -r '.integrationVersion.name')"
VERSION_ID="${VERSION_NAME##*/}"
[[ -n "${VERSION_ID}" && "${VERSION_ID}" != "null" ]] || { echo "upload failed: ${VERSION_NAME}" >&2; exit 1; }
# 3. Publish the DRAFT version (confirm with user first)
curl -sS --fail-with-body -X POST \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{}' \
"${BASE_URL}/integrations/${INTEGRATION_NAME}/versions/${VERSION_ID}:publish"
# 4. Invoke the published version synchronously — sends a real email to RECIPIENT_EMAIL (confirm with user first)
curl -sS --fail-with-body -X POST \
-H "Authorization: Bearer ${TOKEN}" \
-H "Content-Type: application/json" \
-H "X-Server-Timeout: 120" \
-d "{
\"triggerId\": \"api_trigger/${TRIGGER_NAME}\",
\"inputParameters\": {
\"orderId\": {\"stringValue\": \"ORD-1001\"}
}
}" \
"${BASE_URL}/integrations/${INTEGRATION_NAME}:execute" \
| jq '{executionId, outputParameters}'Example 2: Python Discovery Client Workflow (Built from the API Reference)
No official Python sample is published on docs.cloud.google.com; the following workflow is built from the v1 API discovery document (google-api-python-client). The caller must hold roles/iam.serviceAccountUser on RUN_AS_SA (projects with governance require a run-as service account to publish). Because EmailTask sends real email, confirm RECIPIENT_EMAIL and each state-changing call (upload, publish, execute) with the user before running. Install dependencies first with pip install "google-api-python-client>=2.100.0,<3" "google-auth>=2.20.0,<3" (changes host or credential state; get the user's approval first).
import json
from googleapiclient.discovery import build
PROJECT_ID = "PROJECT_ID"
LOCATION = "LOCATION"
INTEGRATION_NAME = "INTEGRATION_NAME"
TRIGGER_NAME = "TRIGGER_NAME"
RECIPIENT_EMAIL = "RECIPIENT_EMAIL"
parent = f"projects/{PROJECT_ID}/locations/{LOCATION}"
integration_path = f"{parent}/integrations/{INTEGRATION_NAME}"
service = build("integrations", "v1")
integrations_api = service.projects().locations().integrations()
versions_api = integrations_api.versions()
# 1. List existing integrations (read-only)
listed = integrations_api.list(parent=parent, pageSize=20).execute()
for item in listed.get("integrations", []):
print(item["name"], "active=", item.get("active"))
# 2. Upload a DRAFT version — creates INTEGRATION_NAME if it does not exist yet (set RUN_AS_SA and confirm RECIPIENT_EMAIL and action with user before running; caller needs roles/iam.serviceAccountUser on RUN_AS_SA)
version_dict = {
"description": "API-triggered order notification integration",
"runAsServiceAccount": "RUN_AS_SA",
"triggerConfigs": [{
"label": "API Trigger",
"triggerType": "API",
"triggerNumber": "1",
"triggerId": f"api_trigger/{TRIGGER_NAME}",
"properties": {"Trigger name": TRIGGER_NAME},
"startTasks": [{"taskId": "1"}],
}],
"taskConfigs": [{
"task": "EmailTask",
"taskId": "1",
"displayName": "Send Email",
"taskExecutionStrategy": "WHEN_ALL_SUCCEED",
"parameters": {
"To": {"key": "To", "value": {"stringArray": {"stringValues": [RECIPIENT_EMAIL]}}},
"Subject": {"key": "Subject", "value": {"stringValue": "Order notification for $orderId$"}},
"BodyFormat": {"key": "BodyFormat", "value": {"stringValue": "PLAIN_TEXT"}},
"TextBody": {"key": "TextBody", "value": {"stringValue": "Processing order $orderId$."}},
},
}],
"integrationParameters": [{
"key": "orderId",
"dataType": "STRING_VALUE",
"inputOutputType": "IN_OUT",
"defaultValue": {"stringValue": "ORD-0000"},
}],
}
upload_resp = versions_api.upload(
parent=integration_path,
body={"content": json.dumps(version_dict), "fileFormat": "JSON"},
).execute()
version_name = upload_resp["integrationVersion"]["name"]
# 3. Publish the DRAFT version (confirm with user before running)
versions_api.publish(
name=version_name,
body={"configParameters": {}},
).execute()
# 4. Invoke the published version synchronously — sends a real email to RECIPIENT_EMAIL (confirm with user before running)
exec_resp = integrations_api.execute(
name=integration_path,
body={
"triggerId": f"api_trigger/{TRIGGER_NAME}",
"inputParameters": {"orderId": {"stringValue": "ORD-1001"}},
},
).execute()
print("executionId:", exec_resp.get("executionId"))
print("outputParameters:", exec_resp.get("outputParameters"))Common Task Gotchas and Limits
Data limits: Total cumulative integration data (including inputs and outputs) is capped at 30 MB. Above 10 MB, local execution logging is automatically disabled.
Data Mapping: Input and output types must match (cast with
TO_STRING,TO_INT, and so on). Always set a fallback value or null inputs fail the task.Call REST Endpoint: Reaches the public internet only (cannot reach VPC-internal hosts). Fails on HTTP 4xx and 5xx responses. Request max 20 MB, response max 34 MB, max 100 concurrent calls.
JavaScript: Uses the V8 engine (Rhino was deprecated January 24, 2025). Never remove the
executesScript(event)entrypoint. Max script request size is 25 MB.Connectors task: Requires an active Integration Connectors connection (billed separately). Timeout is 3 minutes; Application Integration quotas cap data to and from connections at 8 MB (Integration Connectors quotas list a 10 MB Connectors task payload limit; response max 20 MB).
Approval vs Suspend: Approval tasks can be approved or rejected via
POST .../executions/EXECUTION_ID/suspensions/SUSPENSION_ID:resolvewith body{"suspension": {"eventExecutionInfoId": "EXECUTION_ID", "integration": "INTEGRATION_NAME", "taskId": "TASK_ID", "state": "LIFTED"}}(or"REJECTED"), which is the same call the Cloud console Approve/Reject buttons make and requiresintegrations.suspensions.resolve. Suspend tasks are resumed viaPOST .../integrations/INTEGRATION_NAME/executions/EXECUTION_ID/suspensions/SUSPENSION_ID:lift(where-can replaceINTEGRATION_NAMEand eitherEXECUTION_IDorSUSPENSION_ID, provided at least one ofEXECUTION_IDorSUSPENSION_IDis concrete; accepts an optionalsuspensionResultdefaulting toResolved), which requiresintegrations.suspensions.lift. Listing suspensions (suspensions.list) requiresintegrations.suspensions.list. All three permissions are included inroles/integrations.suspensionResolver(androles/integrations.integrationAdmin); resuming also requiresroles/iam.serviceAccountUseron the integration's run-as service account, requires user confirmation first, and runs the remainder of the execution in async mode.Loops and Sub-integrations: For Each Loop and While Loop allow up to 8,000 iterations; For Each Parallel allows up to 10,000 iterations (default parallelism 50). For sub-integration calls (
Call Integration,For Each Loop,For Each Parallel), child responses/output parameters are returned to the parent only inSYNCmode (ASYNCcalls return no output parameters); avoidSYNCmode if the sub-integration exceeds 2 minutes or includes an Approval task.
See references/tasks-and-gotchas.md for the full task catalog, limits, variable reference syntax, and retry strategies.
Promoting Between Environments (CI/CD)
To promote an integration from development to staging or production:
Externalize environment-specific values (endpoints, project IDs, connection names) as
CONFIG_<NAME>config variables.Provision the target region, run-as service account, Integration Connectors connections, and authentication profiles (
authConfigs) in the target project first (these infrastructure resources are not created by version uploads).Download the tested version JSON (
versions:download?fileFormat=JSON), commit it to Git alongside per-environment config files, rewrite.runAsServiceAccountto the target environment's run-as service account (jq --arg sa "$RUN_AS_SA" '.runAsServiceAccount = $sa' integration.json > integration.env.json) before uploading, and runversions:upload+versions:publishfrom Cloud Build or your CI runner (versions:uploadcreates the integration automatically in the target project if it does not exist yet, producing aDRAFTthat:publishactivates).
See references/cicd-promotion.md for the complete promotion checklist and a ready-to-use Cloud Build pipeline.
Cleanup and Cost Management
Pricing: An active billing account must be attached to the project even when usage stays within the monthly free tier. Application Integration offers a monthly free tier for executions, data processed, and Google service connector nodes, after which executions, data processed, and Integration Connectors nodes incur charges. Review current thresholds and rates on the Application Integration pricing page and estimate costs with the Google Cloud Pricing Calculator.
Unpublish to stop triggers: Run
POST .../versions/VERSION_ID:unpublish(after user confirmation) to stop scheduled, Pub/Sub, or API triggers from firing.Delete versions or integrations:
DELETE .../versions/VERSION_IDarchives a single version (deleting all versions deletes the integration).DELETE .../integrations/INTEGRATION_NAMEpermanently deletes the integration and all its versions.Connector nodes: Unpublishing or deleting an integration does not delete Integration Connectors connections. Delete unused connections at
https://console.cloud.google.com/connectors/connectionsto stop hourly node charges.
Reference Guides
Usage Attribution: Usage attribution for
gcloudCLI commands, directcurlREST calls, and Python discovery-client snippets run in the terminal.REST API Cheatsheet: v1 and v2 endpoints, parameters, filters, and IAM permissions.
IntegrationVersion JSON Reference: Schema for
triggerConfigs,taskConfigs,integrationParameters,ValueType, and config variables.Triggers and Execution Reference: Trigger types,
triggerIdformats,:executevs:schedule, OpenAPI generation, and lifting or resolving suspensions.Tasks and Gotchas Reference: Task-by-task rules, quotas, variable reference syntax, and error handling strategies.
CI/CD Promotion Reference: Cross-project promotion checklist, environment config pattern, and Cloud Build workflow.
Files
- ATTRIBUTION.mdAdded by AutoGineer884 B
- LICENSELicence file added by AutoGineer11.1 KiB
- SKILL.md33.7 KiB
- references/attribution.md5.0 KiB
- references/cicd-promotion.md11.4 KiB
- references/integration-version-json.md14.4 KiB
- references/rest-api-cheatsheet.md19.3 KiB
- references/tasks-and-gotchas.md13.0 KiB
- references/triggers-and-execution.md15.4 KiB
LICENSE
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server, Needs an API key, Needs a command-line tool, Needs Python, Needs Node.js
Security
What our scanner noticed· Low risk
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Publisher
- Google (Official)
- Source
- google/skills · skills/cloud/application-integration-authoring · commit 2194d3b
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Google.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download application-integration-authoring.zip