Search the developer.adobe.com docs. Manage Adobe Developer Console projects, workspaces, APIs, and credentials. Create and test I/O Events registrations and subscriber defined filters.
92%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Low
Low-risk findings worth noting
Mandatory prerequisite: Before starting this skill, read and apply Common Skill Rules.
Guide the user through creating an event registration to receive events from Adobe services.
Before starting: invoke the dev-console-context skill.
Call get_organisations → ask user to pick org. Store both id (numeric) and code (IMS org code).
Ask: "Do you want to use an existing project or create a new one?"
If existing project:
get_projects with filterBy: "me" → show as numbered list → user picks project.If new project:
dev-console-create-project and reuse its returned projectId and workspace context directly. A default project has a single Production workspace; an App Builder template project has Production and Stage, so ask the user which one to use unless they already said.For existing projects: call list_workspaces → auto-select if only one workspace (Production), otherwise ask user to pick.
Call both in parallel:
list_event_providers with both consumerOrgId (org id field) and imsOrgCode (org code field)get_provider_metadata with imsOrgCode (the org code field)Map and enrich:
list_event_providers, collect the unique provider_metadata values across all returned providers.get_provider_metadata results to only those whose id matches one of the collected provider_metadata values — discard the rest.group, label, description, type) for the filtered entries only.Show the enriched list grouped by group — only providers actually available to this org:
Creative Cloud:
1. Adobe Illustrator Cloud Docs — OAuth S2S or User Auth
Adobe Services:
2. Adobe Admin Console Audit Logs — OAuth S2S onlyCredential type display — map providerMetadata.type field:
entp → show "OAuth S2S only"adobeid → show "User Auth only"entp_and_adobeid → show "OAuth S2S or User Auth"Ask the user to pick one provider category.
After picking, if has_multiple_providers: true → show instances (from list_event_providers filtered by providerMetadataId) and let the user pick one or more. If has_multiple_providers: false → auto-select the single instance.
For each selected provider id, call list_provider_events.
Combine all returned event types. Show and ask user to pick one or more:
1. Cloud Doc Deleted (ai_cloud_docs_deleted)
2. Cloud Doc Created (ai_cloud_docs_created)
3. Cloud Doc Updated (ai_cloud_docs_updated)Use the type from the selected provider metadata to determine which credential types are valid:
Provider metadata type | Valid credentials to show |
|---|---|
entp | OAuth S2S only |
adobeid | User Auth (AdobeId) only |
entp_and_adobeid | Both OAuth S2S and User Auth |
4a. Ask credential type first (based on provider type):
entp → skip asking, proceed with OAuth S2S automaticallyadobeid → skip asking, proceed with User Auth automaticallyentp_and_adobeid → ask:
This provider supports multiple credential types. Which would you like to use?
1. OAuth Server-to-Server
2. User Auth (AdobeId)4b. If OAuth S2S selected:
get_credentials and check if one exists (flow_type: "entp" or integration_type: "oauth_server_to_server")get_credential_secrets with id_integration to get client_iddev-console-subscribe-api skill (### OAuth Server-to-Server section), then call get_credential_secrets4c. If User Auth selected:
Ask for platform: WebApp, SinglePageApp, NativeApp, or apiKey.
get_credentials and check if a User Auth credential exists for that platform (flow_type: "adobeid")get_credential_secrets to get client_iddev-console-subscribe-api skill (### User Auth — AdobeId section) for the chosen platform, then call get_credential_secretsAsk the user to pick one delivery type:
How would you like to receive events?
1. Journal — poll events from a journal endpoint (Adobe manages the queue)
2. Webhook — push events to a URL in real time
3. AWS EventBridge — deliver events to AWS
4. Runtime Action — invoke an App Builder runtime actionIf Journal selected: no extra inputs needed.
If Webhook selected:
"webhook", Batch = "webhook_batch"If AWS EventBridge selected:
delivery_type: "aws_eventbridge", goes into destination_metadata: { aws_region, aws_account_id }If Runtime Action selected:
my-org/my-app/my-action)runtime_action fieldApply the shared naming rules.
One create_event_registration call for the delivery type the user picked. Use consumerOrgId, projectId, workspaceId, client_id, name, optional description, events_of_interest, enabled: true.
| Delivery | delivery_type | Extra fields |
|---|---|---|
| Journal | "journal" | — |
| Webhook | "webhook" or "webhook_batch" | webhook_url |
| AWS EventBridge | "aws_eventbridge" | destination_metadata |
| Runtime Action | "journal" | runtime_action |
Note: Adobe automatically provisions a journal in the background for non-journal registrations — do not create a separate journal registration unless the user explicitly chose Journal.
✓ Event registration created successfully!
Provider: {providerLabel}
Events: {event_codes}
Credential: {credentialName} ({credentialType})
Delivery: {delivery_type}
Registration: {name} (ID: {registration_id})If delivery_type is webhook or webhook_batch, check webhook_status in the response:
verified → all good, Adobe confirmed the endpoint.verification_pending → Adobe hasn't sent the challenge yet or the endpoint hasn't responded. Tell the user:
⏳ Webhook verification is pending.
Adobe will send a GET request with a `challenge` query param to your URL.
Your endpoint must respond with the `challenge` value to complete verification.
Run `get_event_registration` in a few moments to check the status.verification_failed → offer to re-trigger (see Webhook Verification Flow below).If delivery_type is journal, tell the user:
📋 Your journal registration is ready. Events will queue here as they arrive.
Use the Journal Reading Flow to fetch them with `get_journal_events_batch`.Trigger when user says "read journal", "fetch events", "poll journal", "get journal events", "what events came in", "show me my events", "read from journal".
Journal is pull-based. Unlike webhook/runtime/AWS EventBridge (push), the consumer fetches batches on demand. Adobe queues events; you drain them.
get_registrations_for_workspace → filter to delivery_type: "journal" → show as numbered list → user picks one.get_credentials → match the registration's client_id to a credential's client_id → use its id_integration as credentialId.since cursor)?"
get_journal_events_batch with consumerOrgId, imsOrgCode, credentialId, registrationId.latest: true.since value → pass as since.Fetched {count} event(s):
1. {type} {time} source: {source}
Fetch more?get_journal_events_batch again with the since cursor from the previous response's _links.next link.Trigger when user says "trace events", "debug delivery", "check event delivery", "why didn't I receive events", "event trace".
Tracing is push-based only. Applicable to
webhook,webhook_batch,aws_eventbridge, andruntime_actionregistrations. Journal registrations have no delivery attempts to trace.
get_registrations_for_workspace → filter out delivery_type: "journal" → show remaining registrations → user picks one.get_credentials → match client_id → use id_integration as credentialId.get_tracing_for_registration with consumerOrgId, imsOrgCode, credentialId, registrationId.Date Event Code Status
2026-06-20T10:00:00 ai_cloud_docs_deleted deliveredTrigger when user says "add more events", "add another provider", "subscribe to more events", "add event type", "extend registration", "add provider to registration".
A registration can cover multiple providers and event types. Adding more must go through
update_event_registration— never create a new registration for this.
Call get_registrations_for_workspace → show as numbered list → user picks one.
Call get_event_registration to fetch the full registration. Display what's already subscribed:
Current events on "{name}":
1. {providerLabel} — {event_code}
2. {providerLabel} — {event_code}Follow Step 2 (Pick event provider) from the main flow to let the user pick a new provider and event types. Skip any providers/event codes already in events_of_interest.
Follow Step 3 (Pick event types) for the newly selected provider.
I'll add the following to "{name}":
+ {providerLabel} — {event_codes}
Existing subscriptions are preserved. Proceed?Call update_event_registration with all existing fields from Step A2 plus the new entries appended to events_of_interest.
Report:
✓ Registration updated!
Name: {name}
Events: {all event_codes, old + new}Trigger when user says "delete registration", "remove event registration", "unsubscribe from events".
get_registrations_for_workspace and show the list.delete_event_registration for the chosen registration. If the user declines the approval prompt, stop — do not retry or work around it — and ask what they would like to do instead.Trigger when:
webhook_status: "verification_failed" in any registration responseHow it works: Calling update_event_registration with the same fields re-triggers Adobe's challenge flow.
Call get_registrations_for_workspace → filter to webhook/webhook_batch registrations with webhook_status: "verification_failed" → show as numbered list → user picks one. Auto-select if only one.
⚠️ Webhook verification failed for "{name}"
Webhook URL: {webhook_url}
Status: verification_failed
Adobe sent a GET challenge request to your webhook URL but did not receive
the correct response. Your endpoint must echo back the `challenge` query
parameter value in the response body.
Would you like me to re-trigger the verification challenge now?Call get_event_registration to fetch the full current registration.
Then call update_event_registration with the exact same values as the current registration:
consumerOrgId, imsOrgCode, projectId, workspaceId, registrationId ← from context
name, description, webhook_url, events_of_interest, delivery_type, enabled ← from current registration✓ Webhook verification re-triggered!
Adobe will now send a new challenge GET request to:
{webhook_url}
Your endpoint must respond with:
HTTP 200
Body: the value of the `challenge` query parameter
Run `get_event_registration` in a few seconds to confirm the status
changes from `verification_pending` → `verified`.If the user's intent is ambiguous, a concept is unfamiliar, or you need more context about an Adobe product or API before proceeding — call search_adobe_docs with the relevant question before asking the user to clarify. For example:
Always prefer fetching from official docs over guessing.
patch_event_registration for targeted changes (enable/disable, rename, change webhook URL)update_event_registration when changing multiple fields at once (events, delivery type, etc.)"/enabled", "/name", "/webhook_url", "/delivery_type"providerMetadata.type to determine valid credential types — never offer credential types not supported by the providerupdate_event_registration); if they explicitly want a new separate registration, proceed with the main creation flowjournal delivery, remind the user to use the Journal Reading Flow (get_journal_events_batch) to fetch eventsget_tracing_for_registration for a journal registrationwebhook_status: "verification_failed" is seen on any registration, proactively flag it and offer the Webhook Verification Flowupdate_event_registration with the exact same fields — always fetch the current registration first via get_event_registration.tessl-plugin
skills