This is part 4 of the Your First Plugin tutorial. Make sure you’ve completed 3. First Integration first.
Declare the integration dependency
Update the node class to reference the integration:integrations works identically on V1 and V2 nodes. This continues the V2
GetWeatherNode from part 2 — its
city input is a bindable=True config field, so call(ctx) reads
self.config.city rather than taking a city argument. (A V1 node would instead
receive city as a keyword argument.)What changed
-
integrations = {"weather_api": ["api_key"]}— declares this node depends on theweather_apiintegration and needs theapi_keyfield. The platform shows a credential picker in the editor and injects the decrypted credentials intoctxfor the run. -
ctx.get_integration_credentials("weather_api")— retrieves the decrypted credentials at runtime as a plaindictkeyed by yourBaseCredentialsfield names. Fall back withor {}and read fields with.get(...)so a missing credential is a clean, actionable failure. -
raise IntegrationFailedError(...)— the SDK’s typed error for credential/API problems (noxus_sdk.errors). Prefer it over a bareValueError: the message crosses the sandbox boundary and becomes the node’s user-visible failure reason (the exception type itself does not cross, so make the message actionable).
How credentials flow
Credentials are never stored in the plugin. They’re decrypted by the platform at execution time and passed through theRemoteExecutionContext for that specific run.
Using multiple integrations
A node can depend on more than one integration:A reusable credentials helper
Real plugins wrap credential lookup in a small helper next to the integration, so every node reads the same fields the same way. The Proxy API scraper plugin does exactly this:Error handling for credentials
Always validate that credentials exist before using them, and raiseIntegrationFailedError so the message surfaces as the node’s failure reason:
Next: Working with Files →
Read and create files from plugin nodes.