Skip to main content
You can build a custom Guild integration for any HTTP-accessible service. You don’t need to be a Guild engineer or wait for first-party support — if your service has an API, you can connect it. Create a custom integration when:
  • You need an integration for a private or internal service (e.g., an internal deployment platform, a self-hosted tool)
  • A first-party integration doesn’t exist yet for a public service you use
  • You want to customize how agents interact with a service beyond what a first-party integration offers

How it works

A custom integration is a versioned package that tells the Guild runtime how to proxy HTTP requests to your service on behalf of agents. You define the endpoints, authentication method, and request/response schemas. Once published, agents can call your integration’s tools exactly like any first-party integration.
The runtime injects credentials automatically, so agents never see raw API keys or tokens.

Creating an integration

You can create integrations from the Guild UI or entirely from the CLI.
Guild validates all integration endpoint URLs to prevent server-side request forgery (SSRF). This applies to the base URL, MCP server URL, OAuth install URL (--install-url), and OAuth token URL (--token-url). Private network ranges, loopback addresses (such as localhost or 127.0.0.1), and internal DNS names are blocked.The same protection applies to JSON schemas. Every $ref must point inside its own document, beginning with #. Guild will not fetch a reference from anywhere else, so a schema that points at a URL or a separate file is rejected when it is parsed. This covers OpenAPI specs, agent input schemas, and schemas served by an MCP server.For local development and testing, expose your local service using a tunneling tool such as ngrok or Localtunnel and use the public URL it provides.

1. Create the integration

For OAuth services, provide the OAuth configuration:
Some OAuth servers require the client credentials to be sent as an HTTP Basic Authentication header on the token exchange request instead of in the POST body. The CLI has no flag for this — set Token Auth Method to Basic on the integration in the web interface. See Token Auth Method below.Use --public to make the integration visible to all users. By default it is private to your account.The command also creates a draft version automatically.
Publishing freezes the endpoint URL, and the OAuth authorization and token URLs with it. Until the integration’s first version is published, the owner can still change them — nothing is installed against the integration yet. Once a version is published, users install credentials against those URLs, so Guild refuses to let the owner repoint them at another server. The whole update is rejected with a 403, not just the URL field, so a request that changes a URL alongside other settings saves none of them. To serve a different endpoint, create a new integration.

2. Define operations

Add operations (endpoints) to your draft version. Each operation becomes a tool that agents can call.Add operations manually:
Or import from an OpenAPI 3.0 or 3.1 spec:
When importing from an OpenAPI spec, Guild reads a request body from application/json, application/json-patch+json, application/x-www-form-urlencoded, or multipart/form-data. A response schema is read from the first three; multipart/form-data is accepted for request bodies only.Guild handles HTTP redirect response codes as follows:
  • Temporary redirects (302, 303, 307): the operation is kept. The response schema is parsed as unknown because the redirect does not define the final response shape.
  • Permanent redirects (301, 308): the operation is skipped. These codes indicate deprecated or moved endpoints.
An operation is skipped when its request body uses none of the content types above, or when it declares no success response. Skipped operations are listed in the endpoint-generator build step, so check there — and in the CLI output when you import from the command line — to see what did not come through.
OpenAPI specifications must be fully self-contained. Guild does not support external $ref pointers — references to external URLs, local file paths, or documents outside the spec. Importing a spec that contains an external $ref fails with a parsing error. This restriction protects against server-side request forgery (SSRF).
You can optionally provide JSON schema files for request and response bodies:

3. Build and publish

Version numbers must be strictly increasing — you cannot publish 1.0.0 after 1.1.0.

4. Test

Test an operation against the live API:
Pass path parameters, query parameters, and request bodies as JSON:
Testing a version against a credential owned by an account — an organization’s shared credential, for example — requires you to be an admin of that account. Anyone else gets a 403 with “Only admins can test integrations with credentials for this account.”

5. Connect credentials

Omit --token for an interactive prompt. Use --owner to connect credentials for an organization account.

6. Configure webhooks (optional)

Pass webhook event definitions as JSON when creating or updating the integration:
Or update an existing integration:
See Webhook format below for delivery requirements.

Endpoint URLs are frozen at first publish

An integration’s URLs stay editable while you are building and testing it, so you can correct a mistake before anyone can install it. That ends at the first publish.
Once any version of an integration has been published, its URLs can no longer be changed — the REST base URL, the MCP server URL, the GraphQL endpoint URL, and the OAuth install and token URLs. Attempting to change one is rejected.Guild injects credentials into outbound requests server-side, so a published integration that could be repointed would be able to send those credentials somewhere new. Set these URLs correctly before you publish the first version.

Request body encoding

For POST, PUT, and DELETE requests, the REST proxy sends the request body as JSON and sets Content-Type: application/json by default. To send a form-encoded body instead, add "Content-Type": "application/x-www-form-urlencoded" to the integration’s extra headers. When you set this header, the proxy preserves it and encodes the request body as URL-encoded form data rather than JSON.

Visibility states

An integration with no published version shows a Draft badge, and its tools are not available to agents. Publishing a version clears the badge and makes the tools importable.

Making an integration public

Integrations are private to your account by default. An integration must already have a published version before it can be made public — setting is_public on one that has none is rejected with 403 Forbidden. So the order is: create the integration, define operations and publish a version, then change visibility. From the CLI:
From the UI, open the integration’s kebab menu and select Publish to Agent Hub. The item appears in one of three states: Once the integration is public, the menu shows View on Agent Hub in place of Publish to Agent Hub.

Moderation and discoverability

Guild can moderate a public integration to keep the Hub’s discovery surfaces trustworthy. Moderation changes where an integration appears; it does not delete it, and existing connections keep working. The state appears as moderation_state on the integration in API responses. Ranked and curated lists are the home feed shelves, Browse all, and Top Creators. A DEMOTED integration is dropped from those but stays findable by name and on your profile. At UNLISTED and below it leaves discovery entirely and is reachable only by direct link, by you, or through an existing connection. Only Guild operators can set or clear a moderation state — you cannot change your own. Contact support if you believe an integration has been moderated in error.

Webhook format

If your integration receives inbound webhooks, your service must send a JSON body matching this format:
action is null for events that don’t have sub-actions. Each delivery must include these headers: X-Guild-Webhook-Signature A cryptographic signature that proves the delivery came from the integration and hasn’t been tampered with in transit. Guild rejects deliveries with a missing or invalid signature. Generate it as follows:
  1. Take the raw request body as a string.
  2. Hash it using HMAC-SHA256 with the webhook secret key.
  3. Hex-encode the result and prefix it: sha256=<hex-encoded hash>
  4. Set that as the value of the X-Guild-Webhook-Signature header.
Signing with Ed25519 instead When you configure the webhook you choose a signature algorithm: HMAC-SHA256 (above) or Ed25519. For Ed25519 you register a public key rather than a shared secret, and each delivery carries a second header: X-Guild-Webhook-Timestamp The POSIX timestamp of the request. Sign the timestamp concatenated with the raw request body, then hex-encode the signature into X-Guild-Webhook-Signature. Guild rejects deliveries whose timestamp is more than 5 minutes old. The public key must be exactly 64 hexadecimal characters — a 32-byte Ed25519 key. Guild rejects anything else with Ed25519 public key must be exactly 64 hexadecimal characters. X-Guild-Webhook-ID A unique identifier for each individual delivery (e.g., a UUID generated fresh per request). Guild uses this to detect and discard duplicate deliveries, which is important because many systems retry failed webhook requests. Content-Type Must be set to application/json. How the webhook URL is set up When a user connects the integration and wants to receive webhook events, Guild generates a unique webhook URL for that connection. The user registers this URL with the external service (usually on its webhook configuration page) so the service knows where to send deliveries. How the secret key is established During that same registration, the external service typically reveals a secret key. The user copies the secret back into Guild, which stores it with the connection and uses it to verify the X-Guild-Webhook-Signature on every incoming delivery. Deliveries with a missing or mismatched signature are rejected. Defining events Each event has a name and an optional list of actions. For example:

Using your integration

Once published, your integration’s tools appear alongside first-party tools in the workspace. Agents import and use them the same way as any other service integration:

Connecting credentials

When a custom integration requires authentication, the workspace administrator configures credentials in Settings > Credentials at app.guild.ai, just like first-party integrations. If an agent invokes a tool from an unconfigured integration, Guild prompts the user to connect their account.

Webhooks

Custom integrations can also receive inbound webhooks from integrations. Configure a webhook URL in your integration, and external events will be routed to agents via event triggers.