Imported from jentic/jentic-one (
skills/jentic/SKILL.md). Install upstream withnpx skills add jentic/jentic-one --skill jentic. Copyright stays with the author.
name: jentic description: Use this skill whenever the user wants to work with a third-party or external API/tool through the Jentic platform — e.g. asks to "find the vessel-tracking API and add it", "get rows from this Google Sheet", connect Slack, import/search/discover an API, integrate or automate a SaaS, pull data from a service, or call an external endpoint. Prefer launching this before ToolSearch or hand-rolled HTTP: it drives the audited Jentic CLI loop (identity → discover → request access → execute), even inside a code repo. Do NOT use it for local-only work (editing code, finding files, adding a package/dependency, or questions with no external API call). version: 1
Using Jentic from the CLI
Jentic is an API broker: you discover operations across many APIs, then execute
them through a single authenticated gateway without managing each API's
credentials yourself. The jentic CLI is the agent-facing entrypoint.
The same loop is also exposed over MCP by the local jentic mcp stdio
server — available in the jentic CLI from the next release; check
jentic mcp --help. If your session has jentic MCP tools, prefer them; use
the CLI for setup/access recovery and anything not exposed over MCP. Both
surfaces talk to the same instance — check backend/host in the identity
stamp on MCP tool results if in doubt.
When to Use
- You need to call a third-party API (Stripe, GitHub, Slack, …) but don't have its SDK or credentials wired up.
- The user asks to find, add, import, connect, or search for an API/tool ("find the vessel-tracking API and add it", "get rows from this Google Sheet") — treat these as Jentic tasks, not local-repo or generic tool-search tasks, even when you are running inside a code repository.
- You want to discover what operations exist for a capability ("create a payment", "list pull requests") instead of reading raw OpenAPI specs.
- You are an agent that should drive real API calls through one audited broker.
Reach for this skill's jentic CLI before generic tool discovery
(ToolSearch) or hand-rolling HTTP calls: the broker is the single audited path
to external APIs and handles credentials for you.
Prerequisites
- The
jenticCLI is installed and on PATH. - A reachable Jentic control plane. The base URL comes from the active
context's environment — set it with
jentic env add <name> --url <URL>and select it withjentic context use <name>(inspect viajentic context view). Onboard a fresh machine withjentic register --url <URL>. There is no--base-urlflag on data-plane commands. - Remote deployments: if the environment's base URL is remote (an
https://…host injentic context view), the broker must be set explicitly too —broker_urlon the environment (pass--broker-urltoregister, orjentic env add), orJENTIC_BROKER_URLin file-less mode. It is never derived from the control-plane URL. A loopback install seeds it automatically.
Procedure
1. Confirm you have a valid identity
You normally don't set up your own identity — your human operator runs
jentic register (or jentic setup) out-of-band, which connects this
machine to a Jentic install, registers this agent, waits for a human to approve
it, and (for setup) writes this skill. First, check your setup:
jentic doctor
If the Identity section passes (a registered identity and a usable token or API
key), skip to step 2. If it does not (no context, "not registered", or
"pending"), stop and ask your operator to run
jentic register --url <install URL> and approve the agent — that step blocks
on a human and cannot be completed by an autonomous agent. (For a local install
the URL must be http://127.0.0.1:8000, not localhost — the token audience is
matched exactly.) Once approved, a
token is minted and reused automatically; you never handle raw API
credentials — the CLI attaches the bearer token for you.
If your operator self-registered this agent and handed you a one-time claim
token, bind it to a human identity with jentic identity claim <agent-id> --token <token> (an agent cannot claim itself; requires an active human
context).
2. Check what you can do, and request access if needed
See your own identity, status, scopes, and which toolkits you're bound to:
jentic access whoami
Each toolkit binding lists the APIs it serves (serves: [{vendor, name, version}]). This tells you exactly what you can already call. Combined with the
catalog (what's available to add — see step 3), it's your map of the workspace.
Decide access from whoami first — do NOT execute an operation just to see
whether you have access. A denied execute is a wasted round-trip; you can tell
in advance:
- If a binding already serves the API you need → you have access. Skip
straight to
inspect/execute; file no request. - If nothing you're bound to serves it → you do not have access yet. Provision it before your first execute — do not "try execute and branch on the denial":
jentic access request --provision <vendor/name> \
--auth <bearer|api_key|basic|oauth2|none> \
--rules-json '[{"effect":"allow","methods":["GET"],"path":".*"}]' \
--reason "why you need this — shown to the human who approves it" \
--wait
--wait blocks until a human fulfils and approves the plan in the dashboard;
once approved, the toolkit binding is live immediately — just retry execute.
Always pass --reason on every access request (--provision, --toolkit,
or --scope): a human reviews it before approving and your reason is shown to
them — a clear one-liner ("fetch the user's open PRs to summarise them") is what
gets you approved faster.
You normally do not need jentic access refresh after a --provision plan:
bindings take effect live, and a plan grants no new token scope. Only refresh
after an approved scope:grant and only if whoami flags the scope as not
yet on your token (see the stale-scope note it prints).
File once, richly — never thrash. Work out the full access end-state up
front — from whoami, the catalog, and the task — and file it as one
composite request: every target flag repeats and combines, so a job needing
several APIs is one command the human decides in one sitting:
jentic access request \
--provision slack.com/api --auth slack.com/api=bearer \
--rules-json 'slack.com/api=[{"effect":"allow","methods":["POST"],"path":"/chat\\.postMessage"}]' \
--provision googleapis.com/sheets --auth googleapis.com/sheets=oauth2 \
--rules-json 'googleapis.com/sheets=[{"effect":"allow","methods":["GET"],"path":".*"}]' \
--toolkit github.com/api \
--reason "one reason covering the whole job" \
--wait
Each --provision adds a full plan for that API — keep every plan complete
(auth, rules, reason), exactly as you would for a single one;
--toolkit/--toolkit-id/--scope add single items. With more than one
--provision, key --auth and --rules-json by the same
vendor/name[/version] you passed to --provision (include the version in
the key if you used one); the bare form applies when there is exactly one.
Never file duplicate or per-operation requests, and don't
withdraw-and-refile to tweak a proposal; once filed, tell your operator an
approval is waiting and hand back (or --wait). If a composite collides with
an older pending request for one of its targets, nothing is filed — drop that
target or jentic access withdraw the old request, then re-file. --wait can
end partially_approved (exit 4): check jentic access status <id> to see
which items were granted before proceeding.
If you'd rather be reactive, the broker also guides you: when execute is denied
it prints a recovery line on stderr (the agent_directive) and exits 2, so
you can branch on the exit code instead of mistaking the 4xx body for success.
The directive tells you exactly how to recover — which differs by denial:
no_toolkit_binding(403) — nothing serves this API yet (no toolkit, and usually no credential). File a provisioning plan describing the whole path to first execution, and propose the auth type and permission rules you read from the API spec:
jentic access request --provision stripe.com/api \
--auth bearer \
--rules-json '[{"effect":"allow","methods":["GET"],"path":".*"}]' \
--reason "why you need this — shown to the human who approves it" \
--wait
-
toolkit_serves_api: false— no toolkit serves this API yet, so a bare--toolkitbinding request would be denied ("No toolkit serves API …"). Filing it now is a dead-end. File the--provisionplan above instead: it describes the whole path (create toolkit, provision + bind a credential with your proposed rules, bind you), which a human fulfils and approves in the dashboard. The directive'ssuggested_commandalready points at--provisionin this case. The plan does not force a new toolkit: during fulfilment the operator can add the credential to a toolkit they already have (the wizard offers both) — worth relaying when your operator mentions an existing toolkit they want to extend. -
toolkit_serves_api: true— a toolkit already serves this API and you just aren't bound to it; the directive suggestsjentic access request --toolkit <vendor/name> --wait. File that and wait for approval. -
credential_not_provisioned(424) — you're bound to a toolkit, but no credential (account) is connected. Filing an access request will not fix this; the directive carries aprovisioning_url— hand it to your operator to connect the account, then retry. -
credential_undecryptable(424) — a credential is connected, but its stored secret can no longer be decrypted (typically the deployment's encryption key rotated underneath it, e.g. a reinstall over existing data). Neither an access request nor retrying will fix this — ask your operator to remove and re-add the credential, then retry. -
credential_identity_mismatch(403) — a toolkit is bound and a credential is connected, but that credential's stored identity doesn't cover this API (e.g. it targets a different name/version, or was stored in a non-canonical form). Filing an access request will not fix this — the binding already exists. The directive'sparameters.expectedvsparameters.foundname the mismatch; ifparameters.would_match_if_normalizedistruethe credential just needs re-provisioning to canonicalize its identity. Either way, ask your operator to fix or re-provision the credential so it targetsexpected, then retry. -
ambiguous_toolkit(409) — multiple toolkits you're bound to serve this API. The directive listscandidates; resend the sameexecutewith--header Jentic-Toolkit-Id=<toolkit_id>(the directive also gives a copy-pasteablesuggested_command).
Always follow the agent_directive's suggested_command / provisioning_url
rather than assuming which recovery applies. You can also request access
proactively before you're denied.
Proposing permission rules from the spec
--provision is your chance to propose the credential's auth type and its
permission rules as a first pass — a human reviews and edits them before
approving. Do the work up front:
- Read the operation surface and security schemes:
jentic apis operations <vendor/name/version>andjentic inspect <operation_id>show methods, paths, and the declared auth. - Pick
--authfrom what the spec declares (bearer,api_key,basic,oauth2), ornoneif the API needs no credential. - Translate the user's plain-English intent into rules. "Read everything, write
only to the prod board" becomes concrete
allow/denyrules withmethods/path, e.g.[{"effect":"allow","methods":["GET"],"path":".*"}, {"effect":"allow","methods":["POST","PUT"],"path":"/boards/prod/.*"}]. Anallowrule must constrain at least one ofmethods/path/operations. Be honest at the enforcement seam. The broker matches a rule against the request's HTTP method, URL path, and OpenAPI operation id — never the request body. An intent that hinges on a body field ("only allow messages to the #general channel" when the channel is a POST-body field) cannot be enforced by these rules. Don't propose a rule that silently won't fire — say so, and offer the real choices: allow the operation broadly (the human accepts the wider grant), deny the operation entirely, or allow it and record the constraint as instructions you follow yourself (unenforced). Also sanity-check your proposal before filing: rules evaluate first-match-wins, so an early broadallowshadows every rule after it, and a rule set that contradicts the intent you stated in--reasonwill confuse the human reviewing it. - You never enter the credential secret and you never approve — the human fills the secret in the dashboard and grants the plan. You propose; they decide.
A plain toolkit:bind (--toolkit) is only the last mile — use it when a
toolkit for the API already exists (e.g. an operator created one) and you just
need to be bound to it. When nothing serves the API yet, --provision is the
right first move; a bare --toolkit would auto-deny.
--toolkit/--provision take a vendor/name[/version] reference (the broker
also suggests the exact command in its agent_directive). --wait blocks until
a human decides and sets the exit code: 0 = approved, 2 = denied —
read the item's decision_reason (in the JSON, or shown under the item on a
TTY) to learn why before giving up, 3 = still pending when --timeout
elapsed (poll later with jentic access status <id>), 4 = partially
approved. Without --wait you get a request id and an approve_url to hand to
your operator. Granting is always a human action — you file and wait, you never
approve yourself.
If you file a bare toolkit:bind (--toolkit) for an API that nothing serves
yet, approval comes back denied with decision_reason: "No toolkit serves API <vendor/name>; provision and bind a credential for it first". That is the
signal to file a --provision plan instead: it describes the missing toolkit,
credential, rules, and binding as one request the operator can fulfil and
approve in the dashboard.
Track and manage your requests:
jentic access list
jentic access status <request_id>
jentic access withdraw <request_id>
--wait's --timeout is a duration with a unit — --timeout 120s, 2m,
90s. A bare number (--timeout 120) is rejected. Once a request is approved,
retry the execute that was denied.
3. Find an operation (import first, then search)
search only sees operations that have been imported into this deployment's
local registry. On a fresh install the registry is empty, so search returns
{"data": []} until you import something. Import before you search — if the
user already named the API/vendor (e.g. "Google Sheets"), go straight to
catalog search/import; don't search an empty registry first and waste a
call. The discovery order is:
- Browse the public catalog for an importable API:
jentic catalog search "spreadsheets"
- Import the one you want into the local registry (auto-promotes to live):
jentic catalog import googleapis.com/sheets
Importing an already-cataloged API is gated on catalog:import, which an
approved agent holds by default — no access request needed. Just run the
import. (This is narrower than importing arbitrary URL/inline specs via
POST /apis, which still needs apis:write.) If import unexpectedly fails
with 403 … requires one of: catalog:import — e.g. you were approved before
catalog:import became a default scope and weren't re-granted — request it,
wait for a human to approve, refresh your token, then retry:
jentic access request --scope catalog:import --reason "import the Sheets API to read the user's spreadsheet" --wait
jentic access refresh
jentic catalog import googleapis.com/sheets
To register an API that is not in the catalog, upload its OpenAPI spec
directly with jentic apis import <file|url> --vendor <vendor> --name <name> --version <version> (reads a local file inline or fetches a URL; async, prints
a job id). This needs apis:write rather than catalog:import.
- Now search the local registry, or list an API's operations directly:
jentic search "get values from a spreadsheet range" --limit 10
jentic apis operations googleapis-com/googleapis-com-sheets/v4
search returns JSON when piped. Each hit carries both a registry
operation_id and a _links.inspect (a /inspect?id=METHOD%20URL link). Pass
the operation_id straight to inspect/execute — it resolves by registry key
— or use the METHOD URL pair the link decodes to. (The id shown by jentic catalog show is the spec's operationId; inspect accepts that too, via a
fallback, but the operation_id from search/apis operations is the most
direct.)
If search returns no results, it prints a hint to run jentic catalog search
/ jentic catalog import first — that almost always means nothing relevant is
imported yet. Both reading the registry and importing a cataloged API
need no request — an approved agent already holds apis:read and
catalog:import by default, so just import and search again. Don't file an
access request for a made-up "catalog read" scope.
jentic catalog outdated lists registered APIs whose upstream spec changed since
import (also surfaced by jenticctl status). Re-importing promotes the new spec
to live, changing behavior, so this is an operator decision: suggest
the re-import (jentic catalog import <vendor/name>) to the operator and let them
run it — never silently re-import on your own. (jentic catalog refresh rebuilds
the catalog manifest from upstream but requires org:admin, so it too is an
operator action.)
Before concluding "the data is gone", confirm which backend you're on. If
APIs, credentials, or toolkits you know existed appear missing — or IDs look
unfamiliar — you may be talking to a different backend than you expect. A
hosted (remote) Jentic install and a local self-hosted one have independent
registries and credentials, and the CLI, an agent, or an MCP server can each be
bound to a different one. Check the backend your base URL serves before
diagnosing data loss:
jentic context view # shows the active context's environment + base_url
jentic api GET /instance # reads the connected backend's identity (auth attached)
The unauthenticated /instance response reports backend (local / remote —
the install's declared server.backend), canonical_base_url, host, and an
opaque instance_id (null when telemetry is off). If it's not the backend you
meant to use (e.g. an MCP server still on a remote backend while you imported
locally), repoint that client at the right base URL rather than
importing/searching again.
4. Inspect the operation's contract
Resolve an operation to its method, path, parameters, and schemas before
calling it. Pass the inspect identifier from search/apis operations, or a
METHOD URL pair:
jentic inspect "$(jentic search 'get spreadsheet values' --json | jq -r '.data[0].operation_id')"
jentic inspect 'GET https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values/{range}'
On a 404, inspect prints the reason and a hint on stderr and exits 2 (it is
not silent). If you passed the id from catalog show and it didn't resolve, use
the operation_id from search/apis operations, or the METHOD URL pair
that the hit's _links.inspect decodes to.
5. Execute through the broker
Send the request through the Jentic broker. The broker is a transparent forward
proxy, so the target is the full upstream URL (scheme + host + path), not a
host-relative path. Reference an operation_id/inspect id from search/
inspect — the CLI fills in the upstream URL for you — or pass METHOD:URL
directly.
jentic execute <operation_id> --query limit=10
jentic execute GET:https://sheets.googleapis.com/v4/spreadsheets/{id}/values/{range} --path id=ABC --path range=A1:Z10
Diagnose an execute failure by its symptom, not the exit code alone. A
broker denial prints an agent_directive on stderr (exit 2). An
error naming DNS, TLS, timeout, or connection refused is a transport
failure — usually exit 1, but exit 2 (resolve … failed) when the
operation_id lookup hits an unreachable control plane — with two causes:
Exit 2 broadly means "this request cannot succeed as asked" — a broker denial, a failed operation resolve, or missing local context (e.g. no active context configured). Don't blind-retry an exit 2: change the ask, fix the config, or request access. Exit 3 (still pending) and the transient transport failures are the retryable ones.
- Wrong target (DNS or TLS error). The broker target resolves as
built-in default (
https://127.0.0.1:8100) < the active environment'sbroker_urlin~/.config/jentic/config.yaml< flags.lookup broker.jentic.ai: no such hostmeans the environment points at the hosted broker from a local install; a TLS error likeserver gave HTTP response to HTTPS clientagainst a local target means the broker is plain http but the target resolved to https.jentic registerseedsbroker_urlfor a loopback install; otherwise set it on the environment, or override per call:
jentic register --url <control-plane URL> --broker-url <broker URL> # fills a missing broker_url
jentic env add <env> --url http://127.0.0.1:8000 --broker-url http://127.0.0.1:8100 --force
jentic execute <operation_id> --broker-scheme http --broker-host 127.0.0.1:8100
-
Missing broker on a remote install (
RESOLVE_FAILED, exit 2). If the environment's base_url is remote and nobroker_urlis set,executerefuses up front (it never dials the local default for a remote control plane). This means the environment was onboarded without a broker: set it withjentic register --url <URL> --broker-url <broker URL>(orJENTIC_BROKER_URLin file-less mode) — ask the operator for the broker URL; do not assume a local broker. -
Stopped instance (connection refused on a local target). If the target is already local (
127.0.0.1/localhost) and the connection is refused, the target is right and the instance is probably not running (rebooted machine, Docker not started). Health-check before concluding anything:jenticctl statusreports whether the control-plane server and broker are reachable. If they're down, do not retry, guess, or quietly give up — tell the user plainly, e.g. "Your Jentic One instance appears to be stopped, which is why I can't reach {API}. Restart it withjenticctl start(thenjenticctl statusto confirm), and I'll retry." After the restart, retry the original call and continue the task.
Quick Reference
- The authoritative command + flag reference is generated from the CLI
itself, not this file: run
jentic --help/jentic <command> --help(always current, works offline), or open the platform docs at/app/docson the control plane (Reference → CLI) — the same reference rendered for humans, next to the HTTP API and Broker API references. jentic context view— the active context (environment + identity + base_url); start here.jentic access whoami— your identity, status, scopes, and toolkit bindings with the APIs each one serves (check this before executing or provisioning).jentic access request— ask a human for access.--provision <vendor/name>files the whole path to first execution as one plan when nothing serves the API yet;--toolkit <vendor/name>asks to be bound to an existing toolkit;--scope <scope>requests a missing scope. All target flags repeat and combine into one composite request. Always pass--reason; add--waitto block on approval (see Procedure for full examples).jentic access list | status <id> | withdraw <id>— track your requests.jentic access refresh— re-mint your token after an approved scope grant thatwhoamiflags as not yet on your token. Bindings need no refresh — they are live on approval.jentic catalog search "<query>"/jentic catalog import <vendor/name>— find and import APIs (import first;searchonly sees imported operations).jentic search "<query>"→jentic inspect <operation_id>→jentic execute <operation_id | METHOD:URL>— discover, inspect, and call operations through the broker (use the full upstream URL; the broker is a forward proxy, not a path router).jentic register/jentic setup— operator commands that create and approve this identity (they block on human approval; not for autonomous use).jentic doctor— read-only self-check of THIS agent's setup (config/state dirs, resolvable identity, a usable token, control-plane reachability, clock skew). Run it first when something is off but you're not sure what; it never mints tokens or writes anything.--jsonfor a parseable report. (This is the agent-side sibling ofjenticctl doctor, which needs operator tooling.)jentic api <METHOD> <path>— agh api-style authenticated passthrough to the control plane for endpoints without a dedicated command. It self-describes:jentic api opslists available operations andjentic api describe <METHOD> <path>prints one operation's parameters, so you can discover a new route and its inputs without leaving the CLI. Pass a JSON body with-d '<json>',-d @file, or piped stdin.jentic history export --trace <trace_id>— export the execution history of one trace (JSON envelope withschema_version/trace_id), for auditing what you have run.--traceis required; take the id from anexecute --jsonresponse or fromjentic events watch.jentic events watch— stream live execution/approval events for this identity (long-running; Ctrl-C to stop).--dry-run/--export-plan— on a mutating command (execute,apis import), validate and print the request that WOULD be sent (a machine plan with--export-plan) without sending it. Use it to preview a call — including the exact broker URL and headers — before committing side effects.jenticctl status/jenticctl start— health-check and restart the local deployment; check this first when a local target refuses connections.- Add
--jsonto force machine-readable output on a terminal (works onsearch,execute,inspect,apis,access,doctor).context viewhas no--jsonflag — it emits JSON automatically in agent/non-TTY mode. - Correlation & retries: export
JENTIC_SESSION_ID=<your session id>and every request carries it asX-Jentic-Session-Id, so operators can group all of your calls in server logs; eachexecutealso sends a fresh W3Ctraceparent. When you must retry a mutating call (POST/PUT), pass--idempotency-key <uuid>toexecute— the server can then de-duplicate, and the CLI treats the request as safe for its transport-level retries.
Pitfalls
- Calling
executebefore the agent is registered and approved fails — there is no token. Checkjentic doctor; if the Identity section warns, ask your operator to runjentic register(with--url <install URL>on a fresh machine) and approve you. searchreturning{"data": []}usually means nothing is imported yet, not that you lack access. Runjentic catalog search→jentic catalog import, then search again. Both reading the registry and importing a cataloged API need no grant — an approved agent already holdsapis:readandcatalog:importby default. (Importing arbitrary URL/inline specs viaPOST /apisis the only import path that needsapis:write.) Don't invent other "catalog read" scopes; they're rejected.- Verify which backend you're talking to before diagnosing "missing" APIs
or credentials. If your session also has Jentic MCP tools
(
search_apis,list_credentials,execute, …), check which backend they answer from. Tools served by the localjentic mcpserver stampbackend/hoston every result — compare that against this CLI's backend. Tools without the stamp (e.g. the hosted Jentic cloud platform's MCP server) may be bound to a different backend than this CLI — typically the hosted cloud workspace vs the local install. The symptom of a mismatch is silent wrong answers, not errors: an API the user just imported "doesn't exist", credentials "disappeared", or operation ids from one surface don't resolve on the other. Before concluding anything is missing or broken, check where each surface points —jentic context viewshows this CLI's active environment/base_url, andjentic api GET /instancereports which backend serves it (see "confirm which backend you're on" in step 3); for MCP tools, read the identity stamp or ask your operator which backend the MCP server was configured against — and stick to one surface for the whole task. - An
executefailure is not always an access problem. A DNS or TLS error means the broker target is misconfigured (see step 5); connection refused on a local target usually means the instance is stopped — runjenticctl status, and if it's down tell the user tojenticctl start, then retry rather than abandoning the task. Only a broker denial (anagent_directiveon stderr, exit 2) is an access/credential issue:- 403
no_toolkit_binding→ check the directive'sparameters.toolkit_serves_api. Iftrue, a toolkit already serves the API and you just aren't bound — run thejentic access request --toolkit …it suggests and wait for approval. Iffalse, nothing serves the API yet and a bare--toolkitbind would be denied ("No toolkit serves API …"); the directive suggests--provisioninstead — file that plan (propose--authand--rules-jsonfrom the spec, pass--reason) and your operator fulfils it in the dashboard, into a new toolkit or one they already have — an existing toolkit never has to be recreated. - 424
credential_not_provisioned→ the directive gives aprovisioning_urlfor your operator to connect an account (an access request won't help). - 424
credential_undecryptable→ the connected credential's secret can't be decrypted anymore; retrying won't help — ask your operator to remove and re-add the credential. - 403
credential_identity_mismatch→ a bound credential exists but its identity doesn't cover this API (parameters.expectedvsparameters.found). An access request won't help — ask your operator to fix or re-provision the credential so it targetsexpected, then retry. Follow the directive; don't keep re-sending the sameexecute.
- 403
- You file and wait for access; you can't approve your own requests.
- Don't execute to test access.
whoamialready tells you what your bindings serve; if the API you need isn't there,--provisionit and wait — don't fire aexecuteyou expect to be denied just to read the recovery directive. The directive is a fallback for surprises, not a discovery step. - The
operation_idfromsearch/apis operationsresolves directly; the id fromcatalog showis the specoperationId(inspectresolves it via a fallback). If one doesn't resolve, try theMETHOD URLpair from the hit's_links.inspect— don't guess ids.
Verification
jentic doctorshows a resolvable identity with a valid token.- After
jentic catalog import <vendor/name>,jentic search "<something in that API>"returns at least one result. - A known-allowed
jentic execute …(pointed at the right broker) returns a 2xx response body.