> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pylon.mortgage/llms.txt
> Use this file to discover all available pages before exploring further.

# Introduction

> This guide introduces Pylon's GraphQL API and explains how to build mortgage workflows programmatically.

export const Terminal = ({children, title = "Terminal"}) => {
  let content = '';
  if (typeof children === 'string') {
    content = children;
  } else if (Array.isArray(children)) {
    content = children.map(child => typeof child === 'string' ? child : String(child)).join('');
  } else {
    content = String(children);
  }
  const trimmedContent = content.replace(/\n+$/, '');
  const lines = trimmedContent.split('\n');
  const [hoveredIndex, setHoveredIndex] = useState(null);
  const [copiedIndex, setCopiedIndex] = useState(null);
  const [copyAll, setCopyAll] = useState(false);
  const [isMinimized, setIsMinimized] = useState(false);
  const [isFocused, setIsFocused] = useState(false);
  const copyToClipboard = (text, index) => {
    const command = text.trim().startsWith('$') ? text.trim().slice(1).trim() : text.trim();
    navigator.clipboard.writeText(command).then(() => {
      setCopiedIndex(index);
      setTimeout(() => setCopiedIndex(null), 1500);
    }).catch(err => {
      console.error('Failed to copy:', err);
    });
  };
  const copyAllCommands = () => {
    const fullContent = content.replace(/\n+$/, '');
    navigator.clipboard.writeText(fullContent).then(() => {
      setCopyAll(true);
      setTimeout(() => setCopyAll(false), 1500);
    }).catch(err => {
      console.error('Failed to copy:', err);
    });
  };
  return <div className={`bg-[#1a1b26] dark:bg-[#0d1117] text-white rounded-xl shadow-2xl font-mono relative my-6 overflow-hidden border transition-all duration-200 ${isFocused ? 'border-blue-500/50 shadow-blue-500/10 ring-2 ring-blue-500/20' : 'border-gray-800 dark:border-gray-700'}`} onClick={() => setIsFocused(true)} onBlur={() => setIsFocused(false)} tabIndex={0}>
      {}
      <div className="flex items-center justify-between px-4 py-3 bg-[#24283b] dark:bg-[#161b22] border-b border-gray-800 dark:border-gray-700">
        <div className="flex items-center space-x-2">
          <button className="w-3 h-3 bg-[#ff5f56] rounded-full hover:bg-[#ff3b30] hover:scale-110 transition-all duration-200 cursor-pointer" aria-label="Close" title="Close"></button>
          <button onClick={() => setIsMinimized(!isMinimized)} className="w-3 h-3 bg-[#ffbd2e] rounded-full hover:bg-[#ff9500] hover:scale-110 transition-all duration-200 cursor-pointer" aria-label={isMinimized ? "Maximize" : "Minimize"} title={isMinimized ? "Maximize" : "Minimize"}></button>
          <button className="w-3 h-3 bg-[#27c93f] rounded-full hover:bg-[#34c759] hover:scale-110 transition-all duration-200 cursor-pointer" aria-label="Maximize" title="Maximize"></button>
        </div>
        <span className="text-xs text-gray-500 dark:text-gray-400 font-medium">{title}</span>
        <button onClick={copyAllCommands} className={`text-xs px-3 py-1 rounded-md transition-all duration-200 inline-block ${copyAll ? 'bg-green-500/20 text-green-400' : 'bg-gray-700/50 text-gray-400 hover:bg-gray-600/50 hover:text-white hover:scale-105'}`} style={{
    minWidth: '80px'
  }}>
          {copyAll ? 'Copied!' : 'Copy All'}
        </button>
      </div>

      {}
      {!isMinimized && <div className="p-4 overflow-x-auto">
        {(() => {
    const hasCommands = lines.some(line => line.trim().startsWith('$'));
    if (!hasCommands) {
      try {
        const processedContent = content.replace(/\n+$/, '');
        if (!processedContent || processedContent.trim() === '') {
          return <pre className="text-sm whitespace-pre font-mono"><code></code></pre>;
        }
        const highlighted = highlightCode(processedContent);
        return <pre className="text-sm whitespace-pre font-mono">
                  <code>
                    {highlighted.map((lineData, lineIndex) => <div key={lineIndex} className="leading-relaxed">
                        {lineData.parts && lineData.parts.length > 0 ? lineData.parts.map((part, partIndex) => {
          let className = 'text-gray-100 dark:text-gray-100';
          if (part.type === 'keyword') {
            className = 'text-purple-400 dark:text-purple-400';
          } else if (part.type === 'type') {
            className = 'text-blue-400 dark:text-blue-400';
          } else if (part.type === 'variable') {
            className = 'text-yellow-400 dark:text-yellow-400';
          } else if (part.type === 'string') {
            className = 'text-green-400 dark:text-green-400';
          } else if (part.type === 'comment') {
            className = 'text-gray-500 dark:text-gray-400 italic';
          } else if (part.type === 'number') {
            className = 'text-cyan-400 dark:text-cyan-400';
          } else if (part.type === 'field') {
            className = 'text-sky-300 dark:text-sky-300';
          } else if (part.type === 'enum') {
            className = 'text-orange-400 dark:text-orange-400';
          } else if (part.type === 'operator') {
            className = 'text-gray-400 dark:text-gray-300';
          }
          return <span key={partIndex} className={className}>
                                {part.text || ''}
                              </span>;
        }) : <span className="text-gray-100 dark:text-gray-100">{lineData.line || ''}</span>}
                      </div>)}
                  </code>
                </pre>;
      } catch (error) {
        console.error('Error highlighting code:', error);
        return <pre className="text-sm whitespace-pre font-mono">
                  <code className="text-gray-100 dark:text-gray-100">{content.replace(/\n+$/, '')}</code>
                </pre>;
      }
    }
    return lines.map((line, index) => {
      const isInput = line.trim().startsWith('$');
      const isComment = line.trim().startsWith('#');
      const content = isInput ? line.trim().slice(1).trim() : line.trim();
      const isCopied = copiedIndex === index;
      const isHovered = hoveredIndex === index;
      let highlightedContent = null;
      if (isComment) {
        highlightedContent = <span className="text-gray-500 dark:text-gray-600 italic">
                  {line.trim().slice(1).trim()}
                </span>;
      } else if (isInput || !isInput) {
        try {
          const highlighted = highlightCode(content);
          if (highlighted.length > 0 && highlighted[0].parts) {
            highlightedContent = highlighted[0].parts.map((part, partIndex) => {
              let className = '';
              if (part.type === 'keyword') {
                className = 'text-purple-400 dark:text-purple-300';
              } else if (part.type === 'type') {
                className = 'text-blue-400 dark:text-blue-300';
              } else if (part.type === 'variable') {
                className = 'text-yellow-400 dark:text-yellow-300';
              } else if (part.type === 'string') {
                className = 'text-green-400 dark:text-green-300';
              } else if (part.type === 'comment') {
                className = 'text-gray-500 dark:text-gray-300 italic';
              } else if (part.type === 'number') {
                className = 'text-cyan-400 dark:text-cyan-300';
              } else if (part.type === 'field') {
                className = 'text-sky-300 dark:text-sky-200';
              } else if (part.type === 'operator') {
                className = 'text-gray-400 dark:text-gray-200';
              } else {
                if (isInput) {
                  className = isCopied ? 'text-green-400' : isHovered ? 'text-white' : 'text-gray-300 dark:text-gray-100';
                } else {
                  className = 'text-violet-400 dark:text-violet-400';
                }
              }
              return <span key={partIndex} className={className}>
                        {part.text || ''}
                      </span>;
            });
          } else {
            highlightedContent = <span className={isInput ? isCopied ? 'text-green-400' : isHovered ? 'text-white' : 'text-gray-300 dark:text-gray-100' : 'text-violet-400 dark:text-violet-400'}>
                      {content}
                    </span>;
          }
        } catch (error) {
          highlightedContent = <span className={isInput ? isCopied ? 'text-green-400' : isHovered ? 'text-white' : 'text-gray-300 dark:text-gray-100' : 'text-violet-400 dark:text-violet-400'}>
                    {content}
                  </span>;
        }
      }
      return <div key={index} className={`
                  flex items-start py-1.5 px-2 -mx-2 rounded-md text-sm transition-all duration-150
                  ${isInput ? 'cursor-pointer' : ''}
                  ${isInput && isHovered && !isCopied ? 'bg-white/5' : ''}
                  ${isCopied ? 'bg-green-500/10' : ''}
                `} onMouseEnter={() => setHoveredIndex(index)} onMouseLeave={() => setHoveredIndex(null)} onClick={() => isInput && copyToClipboard(line, index)} onKeyDown={e => isInput && (e.key === 'Enter' || e.key === ' ') && copyToClipboard(line, index)} role={isInput ? 'button' : undefined} tabIndex={isInput ? 0 : undefined}>
                {isInput && <span className="text-emerald-400 dark:text-emerald-500 select-none mr-2 font-bold" aria-hidden="true">
                    $
                  </span>}
                {isComment && <span className="text-gray-500 dark:text-gray-600 select-none mr-2" aria-hidden="true">
                    #
                  </span>}
                <span className="flex-1 transition-colors duration-150">
                  {highlightedContent || content}
                </span>
                {isInput && <span className={`
                      ml-3 text-xs transition-all duration-200 select-none
                      ${isCopied ? 'text-green-400 opacity-100' : ''}
                      ${isHovered && !isCopied ? 'text-gray-500 opacity-100' : 'opacity-0'}
                    `}>
                    {isCopied ? 'Copied!' : 'Click to copy'}
                  </span>}
              </div>;
    });
  })()}
        </div>}
    </div>;
};

<Terminal>
  {`Welcome to the Pylon Developer Platform (PDP)!`}
</Terminal>

## Manifesto

Mortgage origination is still run like a factory: fifteen stitched-together software SKUs and a production line of people shuffling loans from system to system. LOS, POS, pricing engines, compliance tools, document vendors, AUS, appraisal platforms, capital markets software. None of it was designed to work together, and all of it assumes armies of processors and underwriters to make it function.

We don’t believe the mortgage industry is broken because people are inefficient.
We believe it’s broken because the infrastructure is.

Pylon doesn’t make processors faster or underwriters more productive. We eliminate the factory.

The Pylon API exposes the entire mortgage lifecycle, from prequalification and pricing through underwriting, third-party services, and closing, through a single, unified API. Instead of integrating 15 vendors and orchestrating human workflows, you make API calls while Pylon performs programmatic processing and underwriting server-side.

Affordability, eligibility, pricing, conditions, and underwriting decisions are computed in real time against live rates and guidelines. API responses are executable, guideline-compliant outcomes that can be used directly in borrower-facing products: no manual recalculation, no operational glue, no downstream cleanup.

Pylon also abstracts the entire third-party ecosystem. Credit, income and asset verification, appraisals, AUS submissions, disclosures, and closing services are orchestrated automatically and exposed through consistent primitives.

Mortgage origination doesn’t need more tools or more people.
It needs to be programmable.

Pylon replaces the mortgage factory with API calls, from application to closing, at software speed, with direct access to institutional capital.

***

## What do you need to originate a mortgage? Just Pylon.

Traditional mortgage origination requires dozens of vendors, systems, and integrations. Pylon replaces all of them with a single API.

| Category                           | Software                                                                                                                                                                                              | People                                                                                                                 |
| ---------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| Borrower acquisition & application | • Point of Sale (POS) system<br />• Borrower dashboards                                                                                                                                               | • Processors                                                                                                           |
| Product, pricing & eligibility     | • Product & eligibility engine<br />• Pricing engine <br />• Fee engine <br />• Lock desk system<br />• Secondary pricing tools                                                                       | • Processors<br />• Lock desk analysts<br />• Secondary marketing analysts<br />• Pricing governance / capital markets |
| Identity, compliance & risk        | • KYC / ID verification<br />• OFAC / sanctions screening<br />• Fraud detection <br />• Compliance integration<br />• Consent & eSign tracking                                                       | • Compliance team<br />• Fraud analysts<br />• Risk operations                                                         |
| Core loan file (System of Record)  | • Loan Origination System (LOS)<br />• Document management<br />• Borrower dashboards                                                                                                                 | • Processors<br />• Underwriters<br />• Closers<br />• Ops managers                                                    |
| Credit, income, assets & AUS       | • Credit report integration<br />• AUS gateway (DU / LPA)<br />• Income verification (VOI)<br />• Employment verification (VOE)<br />• Asset verification (VOA) <br />• Tax transcript / 4506-C<br /> | • Processors<br />• Underwriters<br />• Credit policy team                                                             |
| Property, collateral & settlement  | • Property data integration<br />• Appraisal integration <br />• Flood certification<br />• Title ordering integration                                                                                | • Appraisal desk<br />• Collateral / valuation team<br />• Title & escrow coordinators                                 |
| Disclosures & closing documents    | • Disclosure integration<br />• Document generation engine<br />                                                                                                                                      | • Disclosure desks<br />• Compliance reviewers<br />• Closers                                                          |
| Closing & funding                  | • Loan Origination System (LOS) <br />• Money movement integrations<br />                                                                                                                             | • Closers<br />• Funders<br />• Treasury / wire desk                                                                   |
| Post-close, secondary & servicing  | • Secondary / hedging platform<br />• Investor delivery systems<br />• Servicing boarding tools<br />• Servicing platform                                                                             | • Secondary marketing<br />• Post-close auditors<br />• Shipping / collateral team<br />• Servicing onboarding         |
| Finance, accounting & controls     | • Warehouse line management<br />• Vendor risk management                                                                                                                                             | • Finance & accounting<br />• Treasury<br />• Warehouse management<br />• Internal audit<br />• Compliance & risk      |

### Pylon handles it all

All of these capabilities are built into Pylon's API. When you make API calls, Pylon orchestrates the entire mortgage origination process, from application collection through underwriting, third-party services, compliance, and closing, server-side.

### One fee, everything included

You don't have any costs associated with these vendors or integrations. Everything is bundled into a single fee that Pylon charges per closed loan. No per-transaction fees for credit pulls, no monthly subscriptions for LOS access, no per-disclosure charges, no integration setup fees. Just one transparent fee per closed loan.

***

## Getting started

You can begin building with Pylon immediately. No infrastructure setup required.

### Choose your path

Pylon offers multiple ways to build mortgage origination experiences, depending on your needs:

<CardGroup cols={1}>
  <Card title="Build on the API" icon="code" href="/guides/getting-started/e2e-build">
    Build your own loan app and borrower dashboard using Pylon's GraphQL API.
    Create fully custom loan applications and borrower experiences with complete
    control over UI/UX. Pylon handles all mortgage logic, underwriting, and
    third-party integrations server-side.

    **Best for:** Teams who want full design control and custom workflows.
  </Card>

  {" "}

  {" "}

  <Card title="Use Elements" icon="bolt" href="/elements/introduction">
    Spin up quickly with out-of-the-box components. Use Pylon Elements: pre-built,
    production-ready components for loan applications and borrower dashboards. Get
    to market faster with components that handle authentication, form validation,
    document uploads, and disclosure signing out of the box. **Best for:** Teams
    who want to launch quickly with minimal custom development.
  </Card>

  <Card title="Hybrid approach" icon="layers" href="/elements/introduction">
    Create unique pre-filled Elements experiences. Combine the API and Elements
    to create custom experiences. Use the GraphQL API to pre-fill borrower data
    before initializing Elements, customize workflows, and add your own UI
    components alongside Elements.

    **Best for:** Teams who want to customize Elements with their own data and
    workflows.
  </Card>
</CardGroup>

Each path will guide you through the specific steps needed to get started. Click on the card that matches your use case to begin.

If you're not sure which path to choose, start with [Build on the API](/guides/getting-started/e2e-build) for the most comprehensive understanding of Pylon's capabilities, or [Use Elements](/elements/introduction) if you want to get up and running quickly.
