Open navigation

Machines (SDK)

Modified on: Tue, 14 Jul, 2026 at 11:36 AM

Machines ship a reusable workflow, written in Maltego machine DSL, that can call one or many transforms as part of a guided flow.

**Client availability:** Machines are currently supported in Maltego Graph Desktop only. Maltego Graph Browser does not discover or run machines supplied by a custom transform server.

If you only want to group discovery entries together, see the Transform Sets article.

Use a machine when the user should trigger a repeatable workflow instead of calling one transform directly. Common cases include:

  • wrapping a provider-specific transform behind a stable workflow ID
  • fanning out to multiple providers in parallel
  • shipping a curated "deep dive" workflow as a versioned asset

Concrete examples include:

  • a focused "Get Profile" workflow for one provider
  • a multi-path search workflow that fans out to several transforms
  • a reusable follower- or connection-expansion step

Machine DSL example

This is the kind of asset you can ship as machine DSL:

machine('acme.workflow.search_profiles',
        displayName: 'Search Profiles',
        author: 'Acme',
        description: 'Searches several profile sources for the selected input'
) {
    start {
        paths {
            run('acme.lookup.primary')
            run('acme.lookup.secondary')
        }
    }
}

Registering a machine in maltego-transforms

MaltegoMachine ships raw machine DSL with your integration:

from maltego.server import MaltegoMachine, register_machine


@register_machine
class SearchProfilesMachine(MaltegoMachine):
    code = '''
    machine("acme.workflow.search_profiles",
            displayName: "Search Profiles",
            author: "Acme") {
        start {
            paths {
                run("acme.lookup.primary")
                run("acme.lookup.secondary")
            }
        }
    }
    '''

The SDK stores the machine definition and parses the run() and type() references so the discovery bundle can expose which transforms and entity types the machine depends on.

Machine attributes

AttributeMeaning
codeRequired machine DSL string
nameOptional display name override
favoritePin the machine as a favorite
enabledShip the machine enabled or disabled
read_onlyPrevent client-side edits
interactiveAdvertise that the machine depends on interactive capabilities
composite_entitiesAdvertise that the machine uses composed-entity support. Set this when the workflow depends on transforms that return or mutate composed entities. See the Composed Entities article.
input_constraintsAdvertise that the machine relies on input-constraint support. Set this when the workflow depends on transforms that rely on input constraints. See the Input Constraints article.

Scaling the pattern

For a larger integration, keep machine definitions in dedicated files and register them from a small registry module:

for machine_class in discover_machines():
    register_machine(machine_class)

This keeps the workflow assets in dedicated files, makes it easy to review and group them by domain, and avoids hard-coding every machine in one Python module.

Did you find it helpful? Yes No

Send feedback
Sorry we couldn't be helpful. Help us improve this article with your feedback.