API reference

iF Chile API

Capture campaign leads and read live space pricing to build your own quotations — all through a single, versioned REST API.

Agency

Lead intake for marketing partners. Push leads from campaigns, landing pages, and paid channels straight into the sales pipeline.

CRM

Everything an external CRM needs to operate: the location & space catalog with effective pricing. Quotations are generated on your side — the API never creates them.

  • — All requests and responses are JSON.
  • — Timestamps are ISO 8601 in UTC, e.g. 2026-07-01T13:00:00+00:00.
  • — Identifiers are opaque strings issued by the platform.
  • — The API is versioned in the path: /api/v1.
Base URL
https://api-crm.ifchile.app/api/v1
Your first request
curl https://api-crm.ifchile.app/api/v1/crm/locations \
  -H "Authorization: Bearer iftkn-FZ2v…" \
  -H "Accept: application/json"

Authentication

The API uses bearer tokens with the iftkn- prefix. Tokens are issued by the iF Chile team and are shown exactly once — store them in a secret manager, never in source control.

Every token is scoped to a single module. An agency token only reaches /agency endpoints and a crm token only reaches /crm endpoints. Requests with a valid token but the wrong scope return 403; requests without a token return 401.

Send the token on every request in the Authorization header.

Authenticated request
# Module-scoped bearer token
curl https://api-crm.ifchile.app/api/v1/crm/locations \
  -H "Authorization: Bearer iftkn-FZ2vQn81xKpd…" \
  -H "Accept: application/json"
Wrong module · 403
{
  "message": "Invalid ability provided."
}

Errors

The API uses conventional HTTP status codes. Every error body carries a human-readable message; validation failures additionally include an errors map keyed by field.

401

Unauthenticated. Missing or invalid token.

403

Forbidden. Wrong module scope, or the API client was disabled.

404

Not found. The resource does not exist upstream.

422

Unprocessable. Validation failed, or the platform rejected the operation (e.g. a visit slot was just taken).

429

Too many requests. Rate limit exceeded — retry after the indicated delay.

502

Bad gateway. The upstream platform is temporarily unreachable. Safe to retry reads.

Validation error · 422
{
  "message": "The first name field is required. (and 1 more error)",
  "errors": {
    "first_name": ["The first name field is required."],
    "source": ["The selected source is invalid."]
  }
}
Upstream outage · 502
{
  "message": "The upstream service is currently unavailable. Please try again later."
}

Rate limits

Each API client may issue up to 120 requests per minute. The current window is exposed via the X-RateLimit-Limit and X-RateLimit-Remaining response headers. When the limit is exceeded the API responds with 429 and a Retry-After header — back off and retry after that many seconds.

Rate limited · 429
{
  "message": "Too Many Attempts."
}

Agency module

Campaign leads

Push prospects captured by campaigns into the sales pipeline. The platform deduplicates people by email or phone and reuses a recent open lead when one exists, so retried submissions never create duplicates. Each token is granted a subset of acquisition sources — list those first, then submit leads using only the values returned.

get /api/v1/agency/sources

List sources

Returns the acquisition channels this token may send in source when creating a lead. The documentation lists every channel the platform knows; this endpoint is the source of truth for what this client can actually use. An empty list means the client cannot create leads.

Parameters

No parameters.
Request
curl https://api-crm.ifchile.app/api/v1/agency/sources \
  -H "Authorization: Bearer iftkn-FZ2v…" \
  -H "Accept: application/json"
Response · 200
{
  "data": [
    "paid_web",
    "google_ads",
    "meta_ads"
  ]
}
get /api/v1/agency/business-lines

List business lines

Returns the published business lines this token may send in business_line. Use the slug, not an internal ID.

Parameters

No parameters.
Request
curl https://api-crm.ifchile.app/api/v1/agency/business-lines \
  -H "Authorization: Bearer iftkn-FZ2v…" \
  -H "Accept: application/json"
Response · 200
{
  "data": [
    {
      "slug": "oficinas-privadas",
      "name": "Oficinas privadas",
      "description": "Espacios de trabajo privados y personalizados"
    },
    {
      "slug": "cowork",
      "name": "Cowork",
      "description": "Ambientes colaborativos y flexibles"
    },
    {
      "slug": "produccion-de-eventos",
      "name": "Producción de eventos",
      "description": "Organización integral de eventos corporativos"
    },
    {
      "slug": "oficinas-virtuales",
      "name": "Oficinas virtuales",
      "description": "Presencia profesional sin oficina física"
    }
  ]
}
post /api/v1/agency/leads

Create a lead

Creates (or upserts) a person and an associated lead. Provide at least an email or a phone number so the platform can identify the contact. Returns the lead and person identifiers, plus a created flag — false means an existing open lead was reused.

Body parameters

first_name string required
The contact's first name.
last_name string
The contact's last name.
email string
Contact email. Required when phone is absent.
phone string
Contact phone in E.164 format. Required when email is absent.
company string
Company the contact represents.
source enum required
Acquisition channel granted to this token. Do not send a value just because it appears in the platform catalog — call GET /api/v1/agency/sources and use one of those strings. Anything else returns 422.
campaign_id string
Optional. The ad-platform campaign ID as a string (Google Ads Campaign ID or Meta campaign.id), not a slug invented by iF. There is no campaign catalog — omit the field when the lead did not come from a paid campaign. Send digits as a string so large Meta IDs are not rounded.
location_id string
Published location slug, not the ULID. One of if-agustinas, if-antofagasta, if-bilbao, if-el-bosque, if-el-golf, if-italia, if-la-florida, if-patio-paris, if-plaza-costanera, if-san-pedro-de-la-paz, if-torres-del-parque, if-zoco, switch-x-if, plus.
business_line string
Published business line slug, not an ID. Call GET /api/v1/agency/business-lines and send one of those slugs: oficinas-privadas, cowork, produccion-de-eventos, oficinas-virtuales.
engagement_type enum
One of new_opportunity, follow_up, reactivation, upsell, cross_sell.
priority enum
One of low, medium, high, urgent.
message string
Free-form message left by the prospect. Max 2,000 characters.
estimated_team_size integer
Number of people the prospect needs space for.
desired_start_date datetime
When the prospect would like to start, ISO 8601.
marketing_consent boolean
Whether the prospect opted into marketing communications.
Request
curl -X POST https://api-crm.ifchile.app/api/v1/agency/leads \
  -H "Authorization: Bearer iftkn-FZ2v…" \
  -H "Content-Type: application/json" \
  -d '{
    "first_name": "Jane",
    "last_name": "Doe",
    "email": "jane@acme.cl",
    "company": "Acme SpA",
    "source": "google_ads",
    "campaign_id": "21201805480",
    "location_id": "if-italia",
    "business_line": "oficinas-privadas",
    "estimated_team_size": 8,
    "desired_start_date": "2026-08-01T00:00:00+00:00",
    "marketing_consent": true
  }'
Response · 201
{
  "data": {
    "lead_id": "ld_3kq9x",
    "person_id": "pe_8m2v1",
    "created": true
  }
}

CRM module

Catalog

Read-only access to published locations, including timezone and weekly business hours.

get /api/v1/crm/locations

List locations

Returns every published location, including its IANA timezone and weekly business hours — both required to interpret visit availability correctly.

Parameters

No parameters.
Request
curl https://api-crm.ifchile.app/api/v1/crm/locations \
  -H "Authorization: Bearer iftkn-FZ2v…"
Response · 200
{
  "data": [
    {
      "id": "loc_9a8b7",
      "name": "iF Italia",
      "slug": "if-italia",
      "address": "Av. Italia 850, Providencia",
      "phone": "+56 2 2840 1100",
      "email": "italia@ifchile.com",
      "whatsapp": "+56 9 7777 1100",
      "capacity": 320,
      "timezone": "America/Santiago",
      "business_hours": {
        "monday": { "open": "09:00", "close": "19:00" },
        "tuesday": { "open": "09:00", "close": "19:00" }
      },
      "status": "active"
    }
  ]
}
get /api/v1/crm/locations/{location}

Retrieve a location

Returns a single location by identifier. Responds with 404 when it does not exist.

Path parameters

location string required
The location identifier.
Request
curl https://api-crm.ifchile.app/api/v1/crm/locations/loc_9a8b7 \
  -H "Authorization: Bearer iftkn-FZ2v…"
Response · 200
{
  "data": {
    "id": "loc_9a8b7",
    "name": "iF Italia",
    "slug": "if-italia",
    "timezone": "America/Santiago",
    "business_hours": {
      "monday": { "open": "09:00", "close": "19:00" }
    },
    "status": "active"
  }
}
get /api/v1/crm/business-lines

List business lines

Same catalog as the agency endpoint: published business lines identified by slug.

Parameters

No parameters.
Request
curl https://api-crm.ifchile.app/api/v1/crm/business-lines \
  -H "Authorization: Bearer iftkn-FZ2v…" \
  -H "Accept: application/json"
Response · 200
{
  "data": [
    {
      "slug": "oficinas-privadas",
      "name": "Oficinas privadas",
      "description": "Espacios de trabajo privados y personalizados"
    }
  ]
}