SendPulse Deal contacts API

The Deal contacts API from SendPulse — 2 operation(s) for deal contacts.

Operations 3

GET /deals/{dealId}/contacts Get a list of contacts in a deal #
POST /deals/{dealId}/contacts/{contactId} Add a contact to a deal #
DELETE /deals/{dealId}/contacts/{contactId} Delete a contact from a deal #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/sendpulse-deal-contacts-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no email required.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

sendpulse-deal-contacts-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  description: Using the API for the CRM service, you can integrate your system with CRM from SendPulse and receive detailed information on pipelines, deals, contacts and their attributes and users. You can also create deals and contacts, assign and remove fields, tags, contact details and instant messengers. On the right, there is a button for authorizing requests made on this page. Click “Authorize,” then insert the ID and Secret from your account. To perform a request directly from the page, click the "Try it out" button within each method block. Then fill in input fields if any (for URL parameters, the description is right below the URL request; for body parameters, the description is under the “Scheme” button to the right of the example), and click “Run.” You will find the server response and description of received parameters below.
  title: SendPulse CRM Public Deal contacts API
  version: 0.1.0
servers:
- url: https://api.sendpulse.com/crm/v1
security:
- apiKey: []
- oauth2: []
tags:
- description: ''
  name: Deal contacts
paths:
  /deals/{dealId}/contacts:
    get:
      tags:
      - Deal contacts
      summary: Get a list of contacts in a deal
      description: Returns a list of contacts in the specified deal
      parameters:
      - name: dealId
        in: path
        required: true
        description: Deal ID for which you want to get the list of contacts. It can be obtained with the "Get a list of deals" method
        schema:
          type: integer
      responses:
        '200':
          description: ''
          content:
            application/json:
              schema:
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Contact'
      operationId: getDealContacts
      x-ai-role: crm_sales_specialist
      x-ai-description: Retrieves all contacts associated with a specific deal in the CRM pipeline. A deal in SendPulse CRM can have multiple contacts linked to it — this endpoint exposes that relationship, enabling agents to understand who the stakeholders are in a given sales opportunity before taking further action (e.g., sending follow-ups or updating contact data).
      x-ai-reasoning-instructions:
      - Ensure the dealId is valid before calling — use 'Get a list of deals' to obtain it if not already known.
      - If the response returns an empty array, inform the user that no contacts are linked to this deal yet and suggest adding contacts.
      - Consider whether the user needs full contact details — this endpoint returns contact objects, but related endpoints may provide richer profile data.
      x-ai-responding-instructions:
      - List the contacts by name (or identifier) returned in the response for clarity.
      - If multiple contacts are returned, summarize the count and highlight key identifiers.
      - Suggest logical next steps such as updating contact info, sending a campaign, or viewing the deal details.
      x-ai-suggestions:
      - Use the returned contact IDs to fetch full contact profiles via the Contacts endpoints.
      - Cross-reference these contacts with mailing lists to check if they are already subscribed.
      - If no contacts are found, use the 'Add contact to deal' endpoint to link relevant contacts.
      x-ai-capabilities:
        confirmation:
          type: None
        security_info:
          data_handling:
          - ReadOnly
  /deals/{dealId}/contacts/{contactId}:
    post:
      tags:
      - Deal contacts
      summary: Add a contact to a deal
      description: Adds a previously created contact to the specified deal
      parameters:
      - name: dealId
        in: path
        required: true
        description: Deal ID in which you want to add the contact. It can be obtained with the "Get a list of deals" method
        schema:
          type: integer
      - name: contactId
        in: path
        required: true
        description: Contact ID you want to add to the deal. It can be obtained with the "Get a list of contacts" method
        schema:
          type: integer
      responses:
        '201':
          description: ''
      operationId: addContactToDeal
      x-ai-role: crm_pipeline_specialist
      x-ai-description: Links an existing contact to a specific deal, establishing a relationship between a person and a sales opportunity. This is a structural association endpoint — both the contact and the deal must already exist. It is typically used after deal creation to assign responsible parties, prospects, or stakeholders to the pipeline item.
      x-ai-reasoning-instructions:
      - Verify that the deal exists before attempting to link — use 'Get a list of deals' to confirm dealId is valid.
      - Verify that the contact exists before linking — use 'Get a list of contacts' to confirm contactId.
      - Check whether the contact is already associated with this deal to avoid duplicate associations.
      - Consider whether the contact's role in the deal (prospect, decision-maker, stakeholder) should be tracked separately via a dedicated field or note.
      x-ai-responding-instructions:
      - On success (201), confirm which contact was linked to which deal by referencing both IDs.
      - Suggest reviewing the deal's full contact list as a follow-up using the appropriate GET endpoint.
      - If a 404 or validation error occurs, clarify which resource (deal or contact) was not found and guide the user to retrieve the correct ID.
      x-ai-suggestions:
      - First retrieve available deals via 'Get a list of deals', then contacts via 'Get a list of contacts' before calling this endpoint.
      - After linking, consider adding a note or task to the deal to document the contact's role.
      x-ai-capabilities:
        confirmation:
          type: None
        security_info:
          data_handling:
          - RelationshipCreate
    delete:
      tags:
      - Deal contacts
      summary: Delete a contact from a deal
      description: Removes the contact from the specified deal
      parameters:
      - name: dealId
        in: path
        required: true
        description: Deal ID from which you want to remove the contact. It can be obtained with the "Get a list of deals" method
        schema:
          type: integer
      - name: contactId
        in: path
        required: true
        description: Contact ID you want to remove from the deal. It can be obtained with the "Get a list of contacts" method
        schema:
          type: integer
      responses:
        '204':
          description: ''
      operationId: removeDealContact
      x-ai-role: crm_deal_manager
      x-ai-description: Disassociates a contact from a deal without deleting either entity. Use this when a person is no longer relevant to a specific sales opportunity — for example, when a stakeholder changes or a contact was added by mistake. The deal and contact continue to exist independently.
      x-ai-reasoning-instructions:
      - Confirm the dealId is valid by cross-referencing with 'Get a list of deals' before attempting removal.
      - Confirm the contactId is currently associated with the specified deal to avoid misleading 404 errors.
      - Warn the user that this action only unlinks the contact from the deal — it does not delete the contact from the CRM.
      - If the user intends to remove the last contact from a deal, note that the deal may become ownerless or harder to track.
      x-ai-responding-instructions:
      - On success (204), confirm that the contact has been unlinked from the deal, not deleted.
      - If the deal or contact is not found, clarify which ID caused the issue and suggest how to retrieve valid IDs.
      - Suggest using 'Get a list of deal contacts' to verify the updated contact list after removal.
      x-ai-suggestions:
      - Use 'Get a list of deals' to retrieve a valid dealId before calling this endpoint.
      - Use 'Get a list of contacts' to retrieve a valid contactId.
      - After removal, call the deal contacts list endpoint to confirm the association no longer exists.
      x-ai-capabilities:
        confirmation:
          type: Recommended
          message: This will remove the contact from the deal. The contact record itself will not be deleted.
        security_info:
          data_handling:
          - RelationshipDelete
components:
  schemas:
    ContactEmail:
      type: object
      properties:
        id:
          type: integer
          description: Email address ID
        email:
          type: string
          description: Email address
        isMain:
          type: boolean
          description: Determines whether the email address is the main one
    ContactHistory:
      type: object
      properties:
        id:
          type: integer
        userId:
          type: integer
        contactId:
          type: integer
        eventType:
          type: string
        eventTime:
          type: string
          format: date-time
        eventData:
          type: object
          properties:
            dealName:
              type: string
    ContactAttributeValue:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        status:
          type: integer
          description: '| Status

            * 0 — inactive (deleted by user) * 1 — active * 2 — hidden'
        type:
          type: integer
        mandatory:
          type: boolean
        contactCardShow:
          type: boolean
        order:
          type: integer
        options:
          type: array
          items:
            oneOf:
            - type: string
            - type: integer
          description: Items of "List" field type
        value:
          properties:
            type:
              type: string
              description: Field type
            value:
              type: string
              description: Field value
          description: ''
        default:
          type: boolean
          description: ''
    ContactPhone:
      type: object
      properties:
        id:
          type: integer
          description: Contact phone ID
        phone:
          type: string
        isMain:
          type: boolean
    ContactMessenger:
      type: object
      properties:
        id:
          type: integer
          description: ID of the added messenger
        typeId:
          type: integer
          description: Messenger type
        login:
          type: string
          description: Contact login in the specified messenger
        botId:
          type: string
          description: External bot ID
        contactId:
          type: string
          description: External contact ID
        status:
          type: integer
        chatbotUrl:
          type: string
          description: URL of the chatbot from which the contact was received
        isMainChatbot:
          type: boolean
          description: Determine if chatbot messenger is the main one
    EntityAttachment:
      type: object
      properties:
        id:
          type: integer
        link:
          type: string
        entityId:
          type: number
        entityType:
          type: string
        createdAt:
          type: string
        updatedAt:
          type: string
    Contact:
      type: object
      properties:
        id:
          type: integer
          description: Contact ID
        userId:
          type: integer
          description: ID of user who created the contact
        sourceType:
          type: string
          enum:
          - manually
          - chatbot
          - subscription_form
          - landing
          - a360
          - payments
        responsibleId:
          type: integer
          description: ID of user responsible for the contact. Can be obtained in the “Get list of invited users” method
        firstName:
          type: string
          description: Contact first name
        lastName:
          type: string
          description: Contact last name
        dealsQty:
          type: integer
        externalContactId:
          type: string
        comments:
          items:
            $ref: '#/components/schemas/ContactComment'
        tags:
          items:
            $ref: '#/components/schemas/ContactTag'
        phones:
          items:
            $ref: '#/components/schemas/ContactPhone'
        emails:
          items:
            $ref: '#/components/schemas/ContactEmail'
        messengers:
          items:
            $ref: '#/components/schemas/ContactMessenger'
        attributes:
          items:
            $ref: '#/components/schemas/ContactAttributeValue'
        history:
          items:
            $ref: '#/components/schemas/ContactHistory'
        tasks:
          type: array
          items:
            type: integer
        createdAt:
          type: string
          format: date-time
          description: The date and time the contact was created. Output in YYYY-MM-DD hh:mm:ss format with fractions of a second and time zone
        updatedAt:
          type: string
          format: date-time
        attachments:
          $ref: '#/components/schemas/EntityAttachment'
    ContactComment:
      type: object
      properties:
        id:
          type: integer
        userId:
          type: integer
        text:
          type: string
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
        attachments:
          $ref: '#/components/schemas/EntityAttachment'
        childCount:
          type: integer
        childUsers:
          type: array
          items:
            type: integer
    ContactTag:
      type: object
      properties:
        id:
          type: integer
          description: Tag ID
        name:
          type: string
          description: Tag name
        colorText:
          type: string
        colorBackground:
          type: string
        contactCount:
          type: integer
          description: Number of contacts associated with the tag
        taskCount:
          type: integer
          description: Number of tasks associated with a tag
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: 'Static API Key authentication.  A long-lived token generated manually in the SendPulse account settings.

        '
      x-ai-description: 'Permanent authentication token. Ideal for simple integrations without token refresh logic.

        '
    outh2:
      type: oauth2
      description: OAuth 2.0 Client Credentials flow for temporary access tokens.
      flows:
        clientCredentials:
          tokenUrl: https://api.sendpulse.com/oauth/access_token
          scopes: {}
      x-ai-description: 'Standard OAuth 2.0 flow using Client ID and Client Secret.  Provides temporary tokens (valid for 1 hour) for enhanced security.

        '