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

# Sync a CRM object

> **You usually do not need this.** Introw already syncs every connected CRM object automatically about every 15 minutes, so any change made in your CRM is reflected in Introw within the next sync window without any action on your part.

Use this endpoint only when a change must be reflected in Introw **immediately** rather than waiting for the next automatic sync. The typical case is a workflow that computes or mutates a value on the record and whose result must be persisted in Introw right away to keep data integrity. For example, an automation recalculates a field on a deal and that value has to be consistent in Introw at once for partner-facing views, commission calculations, or downstream logic, instead of up to ~15 minutes later.

It forces Introw to re-fetch the single object from your connected CRM (HubSpot or Salesforce) and re-ingest it on demand. `objectId` is that record's id in the CRM. The object is ingested in the context of your linked partners, so partner associations are resolved as part of the sync.

`objectType` takes your CRM's own name for the object, case-insensitively. Introw translates it, so there is nothing to look up or map on your side:

- **Deal**: Salesforce `Opportunity`, HubSpot `Deal`
- **Company**: Salesforce `Account`, HubSpot `Company`
- **Ticket**: Salesforce `Case`, HubSpot `Ticket`
- **Contact**: `Contact` in both
- **Lead**: `Lead` in both

Introw's own type names (`DEAL`, `COMPANY`, `TICKET`, `CONTACT`, `LEAD`) and HubSpot object type ids (`0-3`, `0-2`, `0-5`, `0-1`, `0-136`) resolve to the same objects. **Custom objects** are the one case where the exact name matters: pass the object's API name as your CRM shows it, for example `Partner_Program__c` in Salesforce or `p_partner_application` / `2-12345` in HubSpot. Custom types are used verbatim, not translated.

Authenticated by API key only: no specific scope is required. On success the endpoint returns `204 No Content` and does not return the synced object; read it back from the relevant resource if you need the ingested state.



## OpenAPI

````yaml /openapi.json post /api/v1/crm/objects/{objectType}/sync/{objectId}
openapi: 3.1.0
info:
  title: Introw API
  version: '2026-05-20'
  description: >-
    Customer-facing API for Introw. Manage partners, delegate commission payout
    operations to your finance software, embed the partner portal in your
    product with pre-authenticated sessions, ingest affiliate conversions, and
    trigger on-demand CRM object syncs.
servers:
  - url: https://api.introw.io
  - url: https://api.staging.introw.io
security:
  - ApiKeyAuth: []
tags:
  - name: Partners
    description: >-
      Read and manage partners for the organisation associated with the
      authenticated API key.
  - name: Payouts
    description: >-
      Read and update commission payouts. Delegate approval, scheduling, and
      payment status to your ERP or accounts-payable stack.
  - name: Commission lines
    description: >-
      Create, read, update, decline, and detach commission line items. Lines can
      live in the pending pool or be attached to a payout.
  - name: Collaboration
    description: >-
      Post comments on partner portals, deals, tasks, form submissions, and
      payouts, with rich text, internal visibility, and thread replies. Comments
      trigger the same notifications, workflows, and CRM note sync as comments
      posted in the app.
  - name: Forms
    description: >-
      Submit Introw forms server-to-server. Register deals, share leads, or file
      any other form submission from your own systems; submissions run the exact
      same automation and acceptance pipeline as portal submissions. Read a
      form's field schema first to discover the field ids, value shapes, and
      allowed values to send.
  - name: Auth
    description: >-
      Create pre-authenticated partner portal sessions. Exchange a visitor email
      for a short-lived, single-use portal URL that you embed in an iframe
      inside your own product: one login, fully branded, no login screen for the
      partner.
  - name: Affiliate
    description: >-
      Ingest affiliate conversions from your backend or directly from the
      browser via affiliate.js. Every conversion is anchored to a signed,
      server-side click token (the first-party `_introw_aff` cookie),
      deduplicated, and mapped onto a campaign form submission, so attribution
      cannot be forged or double-counted.
  - name: CRM
    description: >-
      Trigger on-demand syncs of individual CRM objects. Introw already syncs
      every object automatically about every 15 minutes; use this only when a
      change must be reflected in Introw immediately, e.g. a workflow mutated
      the record and its result must persist in Introw right away.
paths:
  /api/v1/crm/objects/{objectType}/sync/{objectId}:
    post:
      tags:
        - CRM
      summary: Sync a CRM object
      description: >-
        **You usually do not need this.** Introw already syncs every connected
        CRM object automatically about every 15 minutes, so any change made in
        your CRM is reflected in Introw within the next sync window without any
        action on your part.


        Use this endpoint only when a change must be reflected in Introw
        **immediately** rather than waiting for the next automatic sync. The
        typical case is a workflow that computes or mutates a value on the
        record and whose result must be persisted in Introw right away to keep
        data integrity. For example, an automation recalculates a field on a
        deal and that value has to be consistent in Introw at once for
        partner-facing views, commission calculations, or downstream logic,
        instead of up to ~15 minutes later.


        It forces Introw to re-fetch the single object from your connected CRM
        (HubSpot or Salesforce) and re-ingest it on demand. `objectId` is that
        record's id in the CRM. The object is ingested in the context of your
        linked partners, so partner associations are resolved as part of the
        sync.


        `objectType` takes your CRM's own name for the object,
        case-insensitively. Introw translates it, so there is nothing to look up
        or map on your side:


        - **Deal**: Salesforce `Opportunity`, HubSpot `Deal`

        - **Company**: Salesforce `Account`, HubSpot `Company`

        - **Ticket**: Salesforce `Case`, HubSpot `Ticket`

        - **Contact**: `Contact` in both

        - **Lead**: `Lead` in both


        Introw's own type names (`DEAL`, `COMPANY`, `TICKET`, `CONTACT`, `LEAD`)
        and HubSpot object type ids (`0-3`, `0-2`, `0-5`, `0-1`, `0-136`)
        resolve to the same objects. **Custom objects** are the one case where
        the exact name matters: pass the object's API name as your CRM shows it,
        for example `Partner_Program__c` in Salesforce or
        `p_partner_application` / `2-12345` in HubSpot. Custom types are used
        verbatim, not translated.


        Authenticated by API key only: no specific scope is required. On success
        the endpoint returns `204 No Content` and does not return the synced
        object; read it back from the relevant resource if you need the ingested
        state.
      operationId: syncCrmObject
      parameters:
        - name: objectType
          in: path
          required: true
          description: >-
            Type of CRM object to sync, in your CRM's own wording
            (`Opportunity`, `Deal`, `Account`, `Company`, …) or a custom
            object's API name. See the description above.
          schema:
            type: string
            minLength: 1
            maxLength: 255
            description: >-
              Type of CRM object to sync, in your own CRM's wording. Introw
              translates it: Salesforce `Opportunity`, `Account`, `Case` and
              HubSpot `Deal`, `Company`, `Ticket` are all accepted
              (case-insensitive), as are Introw's own `DEAL`, `COMPANY`,
              `TICKET`, `CONTACT`, `LEAD`. For a custom object, pass its API
              name exactly as your CRM shows it (for example
              `Partner_Program__c` or `p_partner_application`).
        - name: objectId
          in: path
          required: true
          description: Identifier of the CRM object to sync, as it appears in your CRM.
          schema:
            type: string
            minLength: 1
            maxLength: 255
            description: Identifier of the CRM object to sync.
      responses:
        '204':
          description: >-
            CRM object was fetched and ingested successfully. No content is
            returned.
          headers:
            x-ratelimit-limit-minute:
              description: Maximum number of requests allowed in the current minute.
              schema:
                type: string
            x-ratelimit-remaining-minute:
              description: Number of requests remaining in the current minute.
              schema:
                type: string
            x-introw-credits-limit-month:
              description: >-
                This month's API credit allowance. Absent when the request was
                not metered (for example an authentication failure) or when the
                allowance is unlimited.
              schema:
                type: string
            x-introw-credits-remaining-month:
              description: >-
                API credits left in the current calendar month, after this
                request. `0` on a `402`. Absent when the request was not metered
                or when the allowance is unlimited.
              schema:
                type: string
        '401':
          description: API key is missing, invalid, expired, or revoked.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
          headers:
            x-ratelimit-limit-minute:
              description: Maximum number of requests allowed in the current minute.
              schema:
                type: string
            x-ratelimit-remaining-minute:
              description: Number of requests remaining in the current minute.
              schema:
                type: string
            x-introw-credits-limit-month:
              description: >-
                This month's API credit allowance. Absent when the request was
                not metered (for example an authentication failure) or when the
                allowance is unlimited.
              schema:
                type: string
            x-introw-credits-remaining-month:
              description: >-
                API credits left in the current calendar month, after this
                request. `0` on a `402`. Absent when the request was not metered
                or when the allowance is unlimited.
              schema:
                type: string
        '402':
          description: >-
            Monthly API credit allowance reached. Credits reset at the start of
            the next calendar month.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
          headers:
            x-ratelimit-limit-minute:
              description: Maximum number of requests allowed in the current minute.
              schema:
                type: string
            x-ratelimit-remaining-minute:
              description: Number of requests remaining in the current minute.
              schema:
                type: string
            x-introw-credits-limit-month:
              description: >-
                This month's API credit allowance. Absent when the request was
                not metered (for example an authentication failure) or when the
                allowance is unlimited.
              schema:
                type: string
            x-introw-credits-remaining-month:
              description: >-
                API credits left in the current calendar month, after this
                request. `0` on a `402`. Absent when the request was not metered
                or when the allowance is unlimited.
              schema:
                type: string
            retry-after:
              description: >-
                Seconds until the API credit allowance resets (the start of the
                next calendar month).
              schema:
                type: string
        '409':
          description: >-
            This organisation has no CRM connected, so there is nothing to sync
            from. Connect a CRM in Introw first; retrying does not help.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
          headers:
            x-ratelimit-limit-minute:
              description: Maximum number of requests allowed in the current minute.
              schema:
                type: string
            x-ratelimit-remaining-minute:
              description: Number of requests remaining in the current minute.
              schema:
                type: string
            x-introw-credits-limit-month:
              description: >-
                This month's API credit allowance. Absent when the request was
                not metered (for example an authentication failure) or when the
                allowance is unlimited.
              schema:
                type: string
            x-introw-credits-remaining-month:
              description: >-
                API credits left in the current calendar month, after this
                request. `0` on a `402`. Absent when the request was not metered
                or when the allowance is unlimited.
              schema:
                type: string
        '422':
          description: Path parameters failed validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
          headers:
            x-ratelimit-limit-minute:
              description: Maximum number of requests allowed in the current minute.
              schema:
                type: string
            x-ratelimit-remaining-minute:
              description: Number of requests remaining in the current minute.
              schema:
                type: string
            x-introw-credits-limit-month:
              description: >-
                This month's API credit allowance. Absent when the request was
                not metered (for example an authentication failure) or when the
                allowance is unlimited.
              schema:
                type: string
            x-introw-credits-remaining-month:
              description: >-
                API credits left in the current calendar month, after this
                request. `0` on a `402`. Absent when the request was not metered
                or when the allowance is unlimited.
              schema:
                type: string
        '429':
          description: Rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
          headers:
            x-ratelimit-limit-minute:
              description: Maximum number of requests allowed in the current minute.
              schema:
                type: string
            x-ratelimit-remaining-minute:
              description: Number of requests remaining in the current minute.
              schema:
                type: string
            x-introw-credits-limit-month:
              description: >-
                This month's API credit allowance. Absent when the request was
                not metered (for example an authentication failure) or when the
                allowance is unlimited.
              schema:
                type: string
            x-introw-credits-remaining-month:
              description: >-
                API credits left in the current calendar month, after this
                request. `0` on a `402`. Absent when the request was not metered
                or when the allowance is unlimited.
              schema:
                type: string
        '500':
          description: Unexpected server error.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
          headers:
            x-ratelimit-limit-minute:
              description: Maximum number of requests allowed in the current minute.
              schema:
                type: string
            x-ratelimit-remaining-minute:
              description: Number of requests remaining in the current minute.
              schema:
                type: string
            x-introw-credits-limit-month:
              description: >-
                This month's API credit allowance. Absent when the request was
                not metered (for example an authentication failure) or when the
                allowance is unlimited.
              schema:
                type: string
            x-introw-credits-remaining-month:
              description: >-
                API credits left in the current calendar month, after this
                request. `0` on a `402`. Absent when the request was not metered
                or when the allowance is unlimited.
              schema:
                type: string
        '502':
          description: >-
            Introw could not reach your CRM, or could not fetch or ingest the
            object. Retry later.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicApiError'
          headers:
            x-ratelimit-limit-minute:
              description: Maximum number of requests allowed in the current minute.
              schema:
                type: string
            x-ratelimit-remaining-minute:
              description: Number of requests remaining in the current minute.
              schema:
                type: string
            x-introw-credits-limit-month:
              description: >-
                This month's API credit allowance. Absent when the request was
                not metered (for example an authentication failure) or when the
                allowance is unlimited.
              schema:
                type: string
            x-introw-credits-remaining-month:
              description: >-
                API credits left in the current calendar month, after this
                request. `0` on a `402`. Absent when the request was not metered
                or when the allowance is unlimited.
              schema:
                type: string
components:
  schemas:
    PublicApiError:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              description: Stable machine-readable error code.
            message:
              type: string
              description: Human-readable error message.
            details:
              description: Optional structured details for validation and debugging.
          required:
            - code
            - message
          additionalProperties: false
      required:
        - error
      additionalProperties: false
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: Introw API key shown once when the credential is created.

````