# Integrate with CRM & Phone
Source: https://docs.usegizmo.com/agents/integration
Using Gizmo for [CRM & Phone](/origination-desk/index) is recommended for the best experience and requires zero configuration. This page is for customers who are using an external system.
You can fully integrate a 3rd-party CRM & Phone System with just a few quick steps.
## Add your Lead Sources
For each lead provider you will have leads coming in from, you need to add a new lead provider in your [Lead Provider Settings](https://app.usegizmo.com/settings/leads).
Make sure the "slug" for each provider matches the slug in your external system.
## Create an API Key
Go to your [API Keys](https://app.usegizmo.com/settings/api-keys) in your dashboard and create a new API key.
Copy and paste the value, store it somewhere secure and share it with the developer who will be setting up the integration.
## Forward leads to Gizmo
When each lead arrives in your external system, you will need to forward them to Gizmo via our API.
Developers can use our [API Documentation](/api/reference) to easily build & test the integration.
## Set up an inbound transfer number
In your phone system, you will need to create a new inbound transfer number for Gizmo to transfer calls to.
Add this number in your [Agents Dashboard](https://app.usegizmo.com/agents/settings) under the "Inbound Transfer Number" setting.
When a transfer comes in from Gizmo, the Caller ID will be the **borrower's** phone number.
Use this number to look up the lead in your CRM and display helpful information to your loan officers.
## Keep the lead status up to date
Using the [Gizmo API](/api-reference), you can update leads after key events occur.
Updating the record in Gizmo after these events will ensure the agents behave as expected and remain compliant.
| Event | Action |
| :--------------------------- | :------------------------------------ |
| Credit is pulled | Update the status to "CREDIT\_PULLED" |
| Loan is submitted to process | Update the status to "PROCESSING" |
| Lead is withdrawn | Update the status to "WITHDRAWN" |
Full documentation including example requests are available in our [API Reference](/api-reference).
# Create Application
Source: https://docs.usegizmo.com/api-reference/application/create-application
https://app.stainless.com/api/spec/documented/gizmo-sdk/openapi.documented.yml post /applications
# Get Application
Source: https://docs.usegizmo.com/api-reference/application/get-application
https://app.stainless.com/api/spec/documented/gizmo-sdk/openapi.documented.yml get /applications/{id}
# Update Application
Source: https://docs.usegizmo.com/api-reference/application/update-application
https://app.stainless.com/api/spec/documented/gizmo-sdk/openapi.documented.yml patch /applications/{id}
# Authentication
Source: https://docs.usegizmo.com/api-reference/index
All requests to Gizmo APIs must contain a valid API key.
## Get an API key
[Create a new API key](https://app.usegizmo.com/settings/api-keys) in the Gizmo dashboard.
## Authenticate HTTP Requests
Simply pass the API key in the `Authorization` header using the `Bearer` scheme.
## Authenticate with the Gimzo SDK
Gizmo publishes type-safe, lightweight SDKs for Typescript and Python.
### Install the SDK
```bash theme={"theme":"dracula"}
npm install @gizmo-os/sdk
```
```bash theme={"theme":"dracula"}
pnpm add @gizmo-os/sdk
```
```bash theme={"theme":"dracula"}
bun add @gizmo-os/sdk
```
```bash theme={"theme":"dracula"}
pip install gizmo-sdk
```
### Authenticate with Environment Variables
Set the `GIZMO_API_KEY` environment variable to your API key you created in the Gizmo dashboard. The SDK will automatically use this environment variable to authenticate your requests.
```typescript index.ts theme={"theme":"dracula"}
import Gizmo from '@gizmo-os/sdk';
// Uses GIZMO_API_KEY environment variable
export const gizmo = new GizmoSDK();
const application = await gizmo.applications.retrieve('')
```
```python index.py theme={"theme":"dracula"}
from gizmo_sdk import Gizmo
client = Gizmo()
application = client.applications.retrieve(
"",
)
```
### (Optional) Pass in the API key directly
As an alternative, you can pass the API key directly to the SDK constructor.
```typescript index.ts theme={"theme":"dracula"}
import Gizmo from '@gizmo-os/sdk';
export const gizmo = new GizmoSDK({
apiKey: '',
});
const application = await gizmo.applications.retrieve('')
```
```python index.py theme={"theme":"dracula"}
from gizmo_sdk import Gizmo
client = Gizmo(
api_key="",
)
application = client.applications.retrieve(
"",
)
```
This method is great for local testing and development, but it is **not recommended** for production environments. **Never** commit your API key to version control.
# Rate Limits
Source: https://docs.usegizmo.com/api-reference/rate-limits
Gizmo API implements rate limiting to ensure fair usage and maintain service stability. Rate limits are applied per organization and are reset every minute.
## Rate-Limited Endpoints
All write operations are rate-limited. This includes any `POST`, `PATCH`, or `DELETE` endpoints. `GET` endpoints are not rate-limited.
Write operations are rate-limited to 20 requests per minute.
## Handling Rate Limits
When you exceed the rate limit, the API returns a 429 Too Many Requests status code. To handle rate limits effectively:
1. Monitor the rate limit headers to track your usage
2. Implement exponential backoff when you receive a 429 response
3. Space out your requests to stay within the limits
4. Consider batching operations where possible to reduce the number of API calls
# Introduction
Source: https://docs.usegizmo.com/index
Welcome to the Gizmo Documentation
This site provides everything you need to start working and integrating with Gizmo.
Visit our [Guides](/agents/integration) for implementation details, or start building with our detailed [API Reference](/api-reference/index).
Build custom integrations with our detailed API Documentation.
Build custom integrations with our detailed API Documentation.