---
title: "Sending a job offer"
method: POST
path: "/jobs/{jobId}/applications/{applicationId}/job-offers/{jobOfferId}/send"
tags: ["Job Offers"]
---

# Sending a job offer

`POST /jobs/{jobId}/applications/{applicationId}/job-offers/{jobOfferId}/send`

## Request

- Base URL: `https://api.gupy.io/api/v1`
- URL: `https://api.gupy.io/api/v1/jobs/{jobId}/applications/{applicationId}/job-offers/{jobOfferId}/send`
- Auth: HTTP bearer

Sends a job offer by `email`, `whatsapp` or `integration`. `channel` is required.The first successful send moves the offer from `NOT_SENT` to `SENT` and firesthe `job-offer.status-changed` webhook once. Resends on `SENT` or `VIEWED`create a new delivery without changing the offer status or firing the webhook.WhatsApp requires the Smart Vagas module (or an entitlement feature flag)and a candidate mobile number.

## Path parameters

- `jobId` integer, required
- `applicationId` integer, required
- `jobOfferId` integer, required

## Request body

- union
  - JobOfferSendEmailRequest: Send the job offer by email
    - `channel` 'email', required: Delivery channel
    - `senderType` 'company' | 'career-page', required: Defines the sender name shown to the candidate
    - `bcc` string, email: Optional blind carbon copy email address
  - JobOfferSendWhatsAppRequest: Send the job offer by WhatsApp
    - `channel` 'whatsapp', required: Delivery channel
    - `showContactInfo` boolean, required: Whether to show recruiter contact information in the WhatsApp message
    - `contactEmail` string, email: Recruiter contact email. At least one of contactEmail or contactPhone is required when showContactInfo is true
    - `contactPhone` object: Recruiter contact phone. At least one of contactEmail or contactPhone is required when showContactInfo is true
      - `countryCode` string, required: ISO 3166-1 alpha-2 country code
      - `dialCode` string, required: International dialing code
      - `number` string, required: National phone number digits
  - JobOfferSendIntegrationRequest: Send the job offer via external integration (no Gupy messaging)
    - `channel` 'integration', required: Delivery channel

## Response `200`

Job offer sent via integration with portal URL

- JobOfferSendIntegrationResponse
  - `candidatePortalUrl` string, uri, required
  - `deliveryId` integer, required

## Other responses

- `204`: Job offer sent successfully
- `400`: BadRequest / Invalid Input
- `401`: Unauthorized
- `403`: Forbidden
- `404`: NotFound / Resource not found
- `422`: Unprocessable Entity

## Changes

- **2026-11-03** `b84c14658872`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/gupy/apis/gupy-public-api/changes/jobs/:jobId/applications/:applicationId/job-offers/:jobOfferId/send/post.md)

---

[API](https://skmtc.dev/gupy/apis/gupy-public-api.md) - [All operations](https://skmtc.dev/gupy/apis/gupy-public-api/llms.txt) - [OpenAPI document](https://skmtc.dev/gupy/apis/gupy-public-api/revisions/b84c14658872?raw)
