Table of contents
Scale outreach on private email infrastructure
Set up dedicated IPs, domains, and mailboxes.
Start with

Infraforge API: How to Connect Infraforge With Your GTM Stack

The Infraforge API lets you manage cold email infrastructure from your GTM system instead of clicking through a dashboard every time you launch a new market, client, or sender pool.

The short answer: use the Infraforge API when your CRM, RevOps form, n8n flow, Make scenario, backend service, or AI agent needs to create workspaces, check domains, buy or transfer domains, generate mailboxes, export approved senders, and write status back to the CRM.

If you only need a few inboxes once, use the Infraforge dashboard. If your team repeats the same setup every week, use the API.

Infraforge API Swagger documentation
This image shows the Infraforge API Swagger documentation

TL;DR

The production REST base URL is:

https://api.infraforge.ai/public

The public Swagger defines API key authentication through the Authorization header:

Authorization: $INFRAFORGE_API_KEY

For write requests, send JSON:

Content-Type: application/json

You generate the Infraforge API key inside the Infraforge app: log in at app.infraforge.ai, go to Settings, then API, then generate an API key. Store it in your secret manager or orchestration platform. Do not paste it into CRM notes, Slack, spreadsheets, or public logs.

My default GTM workflow is:

  1. Generate an Infraforge API key.
  2. Store it as a secret in n8n, Make, Retool, your backend, or your CI secret store.
  3. Configure https://api.infraforge.ai/public as the production base URL.
  4. Test GET /workspaces before any write action.
  5. Create or retrieve the workspace.
  6. Check domain availability.
  7. Buy or transfer approved domains.
  8. Generate mailboxes.
  9. Poll domain and mailbox status.
  10. Export approved mailboxes to Salesforge.
  11. Write IDs, statuses, and failure reasons back to HubSpot or Salesforce.

The examples below are Swagger-verified request patterns from the public Infraforge API spec. I would still test them in a staging workspace before connecting them to live purchasing.

What You Can Manage Through The Infraforge API

The Infraforge API is not a sending API. It does not send campaign emails.

It manages the infrastructure layer that your sending platform uses.

API Object Confirmed Operations GTM Use Case
Workspaces Create, list, update, delete, eligible IPs Separate clients, markets, brands, or outbound pods.
Domains Check availability, buy, transfer, list, update DNS, forwarding, masking, autorenew Build and manage sender-domain pools.
Mailboxes Buy, generate, list, update, delete, bulk forward, export Provision sender capacity for campaigns.
Billing Get credit balance, create balance, update top-up settings Prevent uncontrolled infrastructure spend.
Pre-warmed Inventory List available pre-warmed domains with pagination Buy ready inventory when timing matters.
Exports Export to Salesforge or CSV formats for supported sequencers Move approved accounts into execution tools.

That is the focus of this guide.

I am not trying to turn this into a broad Forge Stack explainer. For a GTM builder, the job is to move from an approved request to launch-ready infrastructure without losing control of spend, sender reputation, or CRM visibility.

Before You Connect Infraforge

Do this prep before writing code.

You need:

  • An Infraforge account with API access
  • An API key from Settings > API inside app.infraforge.ai
  • A workspace design: by client, region, brand, campaign, or outbound pod
  • Billing approval and credit-balance rules
  • Secondary domains only, not your primary company domain
  • A forwarding destination for domains and mailboxes
  • A Salesforge workspace ID if you plan to export directly
  • A Warmforge workspace ID if you want warmup activated during Salesforge export
  • A secret store for the API key
  • A CRM record where every generated object ID and status will be written back

The most common mistake is starting with code before the operating model is clear.

Decide who approves domain purchases. Decide who owns failed provisioning. Decide what status means “safe to export.” Then automate.

How To Authenticate With The Infraforge API

Infraforge REST authentication boundary
This image shows the Infraforge REST authentication boundary

The REST Swagger uses this API-key scheme:

export INFRAFORGE_BASE_URL="https://api.infraforge.ai/public"
export INFRAFORGE_API_KEY="your_infraforge_api_key"

curl -fsS "$INFRAFORGE_BASE_URL/workspaces" \
  -H "Authorization: $INFRAFORGE_API_KEY" \
  -H "Accept: application/json" 

A successful response is an array of workspaces:

[
  {
    "id": "wks_70my6ggvn5csfw3o27ojq",
    "name": "My Main Workspace",
    "slug": "my-main-workspace",
    "ip": "123.45.67.89",
    "mailserver": "nexus.thecyberspacelink.com",
    "createdAt": "2021-08-01T00:00:00Z",
    "updatedAt": "2021-08-01T00:00:00Z"
  }
] 

Failure condition:

{
  "message": "Bad Request",
  "data": {}
} 

The public spec lists 400 error responses for most endpoints. It does not publish a full authentication-error table, but your integration should still treat missing, expired, or wrong keys as stop-the-workflow failures.

One important distinction: the Forge MCP setup uses product-specific headers such as X-Infraforge-Key. That is for the MCP server path. The public Infraforge REST Swagger uses Authorization.

The Real Setup Workflow

This is the section I would build from if I were connecting Infraforge to a GTM stack.

Each step has the request, the response shape to store, and the failure condition to handle.

1. Generate An Infraforge API Key

Request:

There is no public REST endpoint in the Swagger for creating API keys. Generate the key in the app instead: log in to Infraforge, open Settings, open API, then generate an API key.

Response to store:

INFRAFORGE_API_KEY=your_generated_key

Failure condition:

If the Settings > API option is not visible, the account may not have API access enabled. Stop and ask an admin to enable access. Do not share a teammate’s key.

2. Store The Key In Your Orchestration Platform

For n8n, store it as a credential or environment variable. For a backend service, use your normal secret manager. For CI, use encrypted environment secrets.

Request pattern:

INFRAFORGE_BASE_URL=https://api.infraforge.ai/public
INFRAFORGE_API_KEY= 

Response to store:

Store a secret reference, not the key itself, against the workflow configuration.

Failure condition:

If the API key appears in a workflow execution log, CRM note, or Slack alert, rotate it and fix logging before continuing.

3. Configure The Production Base URL

Use the production base URL from the public Swagger:

https://api.infraforge.ai/public

Request pattern:

curl -fsS "$INFRAFORGE_BASE_URL/workspaces" \
  -H "Authorization: $INFRAFORGE_API_KEY" \
  -H "Accept: application/json" 

Response to store:

Store the HTTP status, request timestamp, and whether the connection test passed.

Failure condition:

If DNS, TLS, timeout, or 401-style authentication failures happen, do not retry writes. Fix connectivity or credentials first.

4. Test A Read-Only Endpoint

Use GET /workspaces as the first test because it does not buy anything.

Request:

curl -fsS "$INFRAFORGE_BASE_URL/workspaces" \
  -H "Authorization: $INFRAFORGE_API_KEY" \
  -H "Accept: application/json" 

Successful response shape:

[
  {
    "id": "wks_70my6ggvn5csfw3o27ojq",
    "name": "My Main Workspace",
    "slug": "my-main-workspace"
  }
] 

Failure condition:

A 400 body follows the shared error schema:

{
  "message": "error message",
  "data": {}
} 

5. Create Or Retrieve A Workspace

Use a workspace to separate clients, regions, brands, or outbound pods.

Request:

curl -fsS -X POST "$INFRAFORGE_BASE_URL/workspaces" \
  -H "Authorization: $INFRAFORGE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "name": "germany-saas-outbound",
    "attachUniqueIp": false
  }' 

Successful response shape:

{
  "id": "wks_70my6ggvn5csfw3o27ojq",
  "accountId": "acc_2cet0p4tov4isv3v1ncyy",
  "name": "My Main Workspace",
  "slug": "my-main-workspace",
  "createdAt": "2021-08-01T00:00:00Z",
  "updatedAt": "2021-08-01T00:00:00Z"
} 

Store id as infraforge_workspace_id in the CRM or ops database.

Failure condition:

If the workspace name is missing, the request fails validation. If a workspace may already exist, list workspaces first and match by your CRM campaign ID or naming convention. The public spec does not document an idempotency key, so your system needs its own dedupe check.

6. Check Domain Availability

Check domains before purchase. Do not let the workflow buy whatever an SDR typed into a form.

Request:

curl -fsS -X POST "$INFRAFORGE_BASE_URL/check-domain-availability-bulk" \
  -H "Authorization: $INFRAFORGE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "domains": ["example-one.com", "example-two.com"]
  }' 

Successful response shape:

[
  {
    "domain": "example-one.com",
    "available": true,
    "price": 12,
    "minCreationPeriodMonths": 12
  }
] 

Failure condition:

The bulk endpoint accepts 1 to 100 domains. More than 100 domains should be split into batches. Reject domains that are unavailable, too close to protected trademarks, too similar to the primary domain, or not approved by the campaign owner.

7. Buy Or Transfer The Domain

Use POST /domains to buy domains and attach them to a workspace.

Request:

curl -fsS -X POST "$INFRAFORGE_BASE_URL/domains" \
  -H "Authorization: $INFRAFORGE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "workspaceId": "wks_70my6ggvn5csfw3o27ojq",
    "domains": ["example-one.com"],
    "contactDetails": {
      "firstName": "Jon",
      "lastName": "Doe",
      "organization": "Infraforge",
      "jobTitle": "CEO",
      "email": "[email protected]",
      "phone": "+370.68883107",
      "address1": "123 Main St",
      "city": "San Francisco",
      "province": "CA",
      "postalCode": "94105",
      "country": "US",
      "dmarcEmail": "[email protected]",
      "forwardToDomain": "example.com"
    }
  }' 

Successful response shape:

{
  "domains": [
    {
      "id": "dom_9xh7elemavnvew01itfxc",
      "workspaceId": "wks_70my6ggvn5csfw3o27ojq",
      "sld": "example-one",
      "tld": "com",
      "status": "pending",
      "forwardingStatus": "pending",
      "ssl": false,
      "masking": false
    }
  ],
  "setup": {
    "id": "set_0d8l2a3u3c3wcn6suq6nn",
    "status": "processing"
  },
  "invoice": {
    "id": "invoice-id",
    "total": 2852,
    "amountPaid": 2852
  }
} 

Failure condition:

This endpoint can charge the account. Put manager approval before this step. Store the invoice ID, domain IDs, and setup ID. If status is pending or setup is processing, do not assume the domain is ready.

If you already own the domains, use the transfer endpoints instead of buying new ones. The public spec includes domain transfer and nameserver-info operations, so keep transfer as a separate branch in your workflow.

8. Generate Mailboxes

Use POST /mailboxes/generate when you want Infraforge to generate mailbox variants from names and domains.

Request:

curl -fsS -X POST "$INFRAFORGE_BASE_URL/mailboxes/generate" \
  -H "Authorization: $INFRAFORGE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "domains": ["example-one.com"],
    "count": 2,
    "type": "predefined",
    "forwardingEmail": "[email protected]",
    "predefinedNames": [
      {
        "firstName": "Mia",
        "lastName": "Stone",
        "signature": "Best, Mia"
      },
      {
        "firstName": "Noah",
        "lastName": "Reed",
        "signature": "Best, Noah"
      }
    ]
  }' 

Successful response shape:

{
  "domains": {
    "example-one.com": [
      {
        "username": "mia",
        "firstName": "Mia",
        "lastName": "Stone",
        "forwardingEmail": "[email protected]",
        "signature": "Best, Mia"
      }
    ]
  }
} 

Failure condition:

The request requires count, domains, and type. Valid name types are predefined, female, male, and combo. If you use predefined, provide at least one first-name and last-name object.

Generating variants is not the same as buying live mailbox slots. Use POST /mailboxes when you need to buy mailbox accounts for the workspace.

9. Poll Provisioning Status

The API exposes status fields on domains, setups, and mailboxes. Use them.

Domain statuses include:

draft, active, pending, failed, expired

Mailbox statuses include:

draft, active, pending, processing, failed

Setup statuses include:

draft, processing, completed, deleted

Poll domains:

curl -fsS "$INFRAFORGE_BASE_URL/domains?search=example-one.com" \
  -H "Authorization: $INFRAFORGE_API_KEY" \
  -H "Accept: application/json" 

Poll mailboxes:

curl -fsS "$INFRAFORGE_BASE_URL/mailboxes?workspace_id=wks_70my6ggvn5csfw3o27ojq" \
  -H "Authorization: $INFRAFORGE_API_KEY" \
  -H "Accept: application/json" 

Successful mailbox response shape:

[
  {
    "id": "mbx_1duj5a6534j37kzook2l9",
    "workspaceId": "wks_70my6ggvn5csfw3o27ojq",
    "email": "[email protected]",
    "domain": "example.com",
    "firstName": "Jon",
    "lastName": "Doe",
    "status": "active",
    "forwardingEmail": "[email protected]"
  }
] 

Failure condition:

Do not export mailboxes while status is pending or processing. Stop on failed and write the failure back to the CRM with the object ID. Use bounded polling, such as every 5 minutes for 60 minutes, then escalate to a human owner.

The public Swagger does not publish webhook endpoints for Infraforge REST. Build polling unless the product team gives you a private webhook contract.

10. Export Approved Mailboxes

For Salesforge, use the dedicated endpoint POST /mailboxes/export-to-salesforge.

Request:

curl -fsS -X POST "$INFRAFORGE_BASE_URL/mailboxes/export-to-salesforge" \
  -H "Authorization: $INFRAFORGE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  -d '{
    "fromWorkspaceId": "wks_70my6ggvn5csfw3o27ojq",
    "toWorkspaceId": "salesforge_workspace_id",
    "toWarmforgeWorkspaceId": "warmforge_workspace_id",
    "tagName": "germany-saas-outbound",
    "warmupActivated": true,
    "includedIds": ["mbx_1duj5a6534j37kzook2l9"]
  }' 

Successful response shape:

[
  {
    "id": "mbx_1duj5a6534j37kzook2l9",
    "email": "[email protected]",
    "firstName": "Jon",
    "lastName": "Doe",
    "status": "active"
  }
] 

Failure condition:

A 409 conflict can return mailbox addresses that could not be imported:

{
  "message": "conflict message",
  "data": {
    "addresses": ["[email protected]"]
  }
} 

Treat conflicts as a data problem, not a retry problem. Write the conflicting addresses back to the CRM and ask the owner whether to skip, rename, or manually resolve.

For CSV export, use POST /workspaces/{workspaceID}/mailboxes/export. Supported export types in the public spec include sf, sl, inst, first_quadrant, luna, reply_io, mailivery, woodpecker, superagi, pipelime, and masterinbox.

11. Write Status Back To The CRM

Infraforge is not your source of truth for GTM ownership. Your CRM or ops database should know what happened.

For HubSpot, I would store these fields on a custom object such as Outbound Infrastructure Request:

CRM Field Value to Store
Infraforge Workspace ID wks_...
Domain IDs dom_... list
Mailbox IDs mbx_... list
Setup ID set_...
Salesforge Export Tag Campaign or market tag
Provisioning Status Requested, processing, active, failed, exported
Failure Reason Error message or conflict addresses
Owner RevOps or GTM engineer
Next Check Time Timestamp for polling or review

Failure condition:

If CRM writeback fails, pause the workflow. Infrastructure created without CRM status is how teams lose track of spend, ownership, and launch readiness.

Example: How I Would Connect This In n8n And HubSpot

HubSpot to Infraforge to Salesforge workflow
This image shows the HubSpot to Infraforge to Salesforge workflow

Here is the simplest useful version.

HubSpot creates a custom object record called Outbound Infrastructure Request.

Required fields:

  • Campaign name
  • Region or market
  • Workspace strategy
  • Requested domains
  • Requested mailbox count
  • Forwarding destination
  • Salesforge workspace ID
  • Warmforge workspace ID
  • Budget approval checkbox
  • Owner email

n8n watches for records where budget_approved = true and provisioning_status = approved.

The n8n flow should run like this:

  1. Read the HubSpot request.
  2. Validate required fields.
  3. Reject primary-domain usage.
  4. Call GET /workspaces to find an existing workspace.
  5. Call POST /workspaces only if no matching workspace exists.
  6. Call POST /check-domain-availability-bulk.
  7. Write domain availability back to HubSpot for approval if needed.
  8. Call POST /domains after approval.
  9. Poll GET /domains and GET /mailboxes until ready.
  10. Call POST /mailboxes/export-to-salesforge.
  11. Update HubSpot status to exported_to_salesforge.

I would send Slack alerts only for exceptions: failed payment, unavailable domains, provisioning timeout, mailbox conflict, or missing Salesforge workspace ID.

Do not send Slack alerts for every successful step. That creates noise and people stop reading the alerts.

Error Handling, Retries, Pagination, And Idempotency

This is where most GTM automations fail.

They work once in a demo, then break when a card fails, a domain is unavailable, a mailbox is still processing, or the CRM sends the same event twice.

Use this operating table:

Topic What the Public Spec Confirms How I Would Handle It
Error Body message and data Store both in CRM or logs.
Common Documented Errors 400 on most endpoints, 409 on Salesforge mailbox export Treat 400 as validation/configuration issues and 409 as duplicate or conflict errors.
Async Operations 202 on bulk forwarding, DNS update, and mailbox deletion; status fields on domains, setup, and mailboxes Poll by object ID or search until the status becomes active or failed.
Pagination GET /mailboxes/pre-warmed supports limit and offset, default 100 Use an explicit limit and increment the offset until all records are retrieved.
Rate Limits No rate-limit number published in the public Swagger Add client-side throttling and exponential backoff.
Idempotency No Idempotency-Key header published in the public Swagger Use CRM request IDs, pre-read checks, and stored object IDs.
Webhooks No Infraforge REST webhook endpoint published in the public Swagger Poll for updates unless you receive a private webhook contract.
Permissions Public Swagger shows API key authentication, not granular scopes Treat the API key as a high-privilege credential for Infraforge operations.

A sane retry policy:

  • Retry network timeouts with exponential backoff.
  • Do not retry validation errors without changing the input.
  • Do not blindly retry purchase endpoints.
  • Do not retry 409 export conflicts as if they are transient.
  • Stop after a fixed number of polling attempts.
  • Write every terminal failure back to the CRM.

For pre-warmed mailbox inventory, use pagination like this:

curl -fsS "$INFRAFORGE_BASE_URL/mailboxes/pre-warmed?limit=100&offset=0" \
  -H "Authorization: $INFRAFORGE_API_KEY" \
  -H "Accept: application/json" 

The pagination object includes:

{
  "limit": 100,
  "offset": 0,
  "total": 250
} 

Where Infraforge Fits In The GTM Stack

Keep the product roles clean.

Layer Product Job
Data Leadsforge Find and enrich prospects.
Infrastructure Infraforge Provision domains and mailboxes.
Readiness Warmforge Warm up mailboxes and run placement checks.
Execution Salesforge Run sequences and manage replies.
CRM HubSpot or Salesforce Store requests, ownership, and provisioning status.

That is enough for this article.

The longer Forge Stack story belongs in category pages and product comparisons. Here, the API workflow is the point.

Security And Operational Guardrails

API access makes infrastructure repeatable. It also makes mistakes repeatable.

I would add these guardrails before letting the workflow run beyond a small pilot:

  • Keep the API key in a secret manager.
  • Rotate the key when a teammate leaves or a workflow leaks logs.
  • Block primary company domains.
  • Require approval before any domain purchase, mailbox purchase, credit balance creation, or top-up change.
  • Store object IDs, not credentials, in the CRM.
  • Use with_credentials=true only when the next system truly needs mailbox credentials.
  • Mask credentials in logs.
  • Separate workspaces by client, brand, or market.
  • Require an owner for every workspace.
  • Gate Salesforge export until mailbox status is active.
  • Keep the raw Swagger link in the internal runbook so engineers can re-check payloads before changing workflows.

Do not let sales reps own this layer. Reps should request capacity. RevOps or a GTM engineer should control provisioning.

Infraforge Pricing For API-Driven Workflows

Pricing checked on July, 2026.

Cost Component Current Listed Cost
Minimum Mailbox Capacity 10 slots
Mailbox Slot Approximately $3 to $4/month, depending on volume and billing
.com Domain Approximately $14/year
Additional IP $99/month
SSL and Domain Masking From $6/domain/year on annual billing
Masterbox From $7/workspace/month on annual billing

The important buying detail is the slot model.

Mailbox slots are capacity. If you buy 10 slots and use 5 mailboxes, you still pay for 10 slots. That is fine when you plan capacity properly. It is wasteful when your automation buys before the GTM plan is approved.

Also remember the wider cost boundary: Salesforge, Infraforge, Warmforge standalone use, Leadsforge, and Agent Frank are separate subscriptions when used separately. Do not sell yourself a fake all-in number.

When To Use The Dashboard Instead

Use the dashboard if this is your first cold email infrastructure setup, your volume is small, or nobody owns the API workflow.

The API is worth it when the work repeats:

  • Agency client onboarding
  • New market launch
  • Sender capacity refill
  • AI SDR infrastructure provisioning
  • Multi-brand outbound operations
  • CRM-approved campaign launches

Mailforge may be a more suitable starting point when shared infrastructure better matches your sending maturity and operational requirements. It does not remove the need for clean targeting, controlled volume, and low complaint rates.

Primeforge may be the cleaner choice when you specifically need Google Workspace or Microsoft 365 mailboxes for ESP matching.

Infraforge is the right API layer when private infrastructure, dedicated control, and repeatable GTM provisioning matter.

Personalized Outbound Strategy

Get The Right Outbound Strategy In Minutes

Enter your email to get a custom plan & stack recommendation for your business

It's being carefully crafted by AI

Please check your mailbox in 5 minutes

Final Verdict: Build The API Around GTM Control

The best Infraforge API workflow is not “automate every endpoint.”

The best workflow is controlled and boring: approved CRM request in, Infraforge workspace created, domains checked, purchases approved, mailboxes generated, statuses polled, approved senders exported to Salesforge, and the CRM updated.

That gives your GTM team a system they can trust.

If your team is still creating domains and mailboxes by hand every time outbound expands, Infraforge helps you turn that work into an infrastructure workflow. Start with one market or one client, prove the status loop, then scale it.