Sponsoring Postings via Snagajob's Sponsorship API

Authentication

Start by requesting an API Key here:

Obtaining API Access

Signing Requests

To ensure authenticity, Snagajob requires that you generate a signature (X-SAJ-Signature) and provide the required headers as part of the request for each API call.

See Generating the X-SAJ-Signaturefor more details

Creating a campaign

Route that proxies POST /campaigns

post
Header parameters
X-SAJ-AccountstringOptional

The account identifier provided by Snagajob. Required if X-SAJ-Partner is not provided.

X-SAJ-PartnerstringOptional

A key provided by Snagajob that represents the partner. Required if X-SAJ-Account is not provided.

X-SAJ-PartnerAccountstringOptional

The unique identifier of the partner's account. The value is owned by partner but shared with Snagajob. Required if X-SAJ-Partner is provided.

X-SAJ-DatestringRequired

The date and time of the request in the RFC1123 format (eg: Mon, 31 Oct 2022 20:23:10 GMT). Dates older then 15 minutes will be rejected.

X-SAJ-SignaturestringRequired

A string specific to the request and signed with a private key as described https://docs.snagajob.com/authentication/generating-the-x-saj-signature".

Body
namestring | nullableOptional

The name of the campaign. Does not need to be unique.

startDatestring · date-time | nullableOptional

The desired start date and time (yyyy-MM-ddThh:mm:ssZ). If null, the campaign will start immediately

endDatestring · date-time | nullableOptional

The desired end date and time (yyyy-MM-ddThh:mm:ssZ). If null, the campaign will remain active until manually paused or budget is exhausted

autoBidLevelstring | nullableOptional

The desired auto bid level. If null, Accelerated will be used

cpcnumber · double | nullableOptional

The target cost per apply click. If null, will be dynamic per market

maxCpcnumber · double | nullableOptional

The maximum cost per apply click for dynamic per market pricing

budgetnumber · double | nullableOptional

The budget for the campaign. NOTE: For Monthly campaigns (period=1), this value will replenish at the beginning of each calendar month

paidCpaGoalnumber · double | nullableOptional

The target cost per application which is used to derive a dynamic cost per click

periodinteger · enumOptional

The enum for what period of time the cap should be refreshed after Only use case right now is monthly, but can be expanded upon to be weekly, fortnightly, quarterly, etc.

Possible values:
Responses
200
OK
post
POST /v1/campaigns HTTP/1.1
Host: 
X-SAJ-Date: text
X-SAJ-Signature: text
Content-Type: application/json-patch+json
Accept: */*
Content-Length: 385

{
  "name": "text",
  "startDate": "2025-07-14T17:30:17.870Z",
  "endDate": "2025-07-14T17:30:17.870Z",
  "autoBidLevel": "text",
  "cpc": 1,
  "maxCpc": 1,
  "budget": 1,
  "paidCpaGoal": 1,
  "period": 0,
  "targeting": {
    "cities": [
      {
        "name": "text",
        "stateProvCode": "text"
      }
    ],
    "externalCampaignId": "text",
    "jobDescKeywords": [
      "text"
    ],
    "jobTitles": [
      "text"
    ],
    "postalCodes": [
      "text"
    ],
    "requisitionIds": [
      "text"
    ],
    "stateProvCodes": [
      "text"
    ]
  }
}
200

OK

{
  "id": "text",
  "accountId": "text",
  "name": "text",
  "startDate": "2025-07-14T17:30:17.870Z",
  "endDate": "2025-07-14T17:30:17.870Z",
  "budget": 1,
  "autoBidLevel": "text",
  "cpc": 1,
  "maxCpc": 1,
  "period": 0,
  "targeting": {
    "cities": [
      {
        "name": "text",
        "stateProvCode": "text"
      }
    ],
    "externalCampaignId": "text",
    "jobDescKeywords": [
      "text"
    ],
    "jobTitles": [
      "text"
    ],
    "postalCodes": [
      "text"
    ],
    "requisitionIds": [
      "text"
    ],
    "stateProvCodes": [
      "text"
    ]
  },
  "status": 0,
  "spend": 1,
  "sponsoredPostings": 1,
  "leads": 1,
  "paidCpaGoal": 1
}

Parameter Descriptions

Name
Required?
Description
Allowed values
Example

name

Yes

The name of the campaign. Do not have to be unique.

any string

startDate

No

The desired start date of the campaign. If left null, the campaign will start immediately.

endDate

No

The desired end date of the campaign. If left null, the campaign will remain active until manually paused or the entire budget is spent. Note: For monthly campaigns ("period": 1), the campaign will resume at the beginning of each month if this is left null with a fresh budget, even if the budget was reached this month.

autoBidLevel

No

The desired autoBidLevel for the campaign (will default to “accelerated” if left blank and no cpc is provided).

string

accelerated, standard

paidCpaGoal

No

The desired cost per application. The value will be used to set dynamic cost per apply click.

number

10.0

cpc

No

The target cost per apply click (will be dynamic per market if left blank)

number

3.14

budget

No

The budget for the campaign. Note: For monthly campaigns ("period": 1), this value will replenish at the beginning of each calendar month.

number

period

No

The recurrence of the budget.

number

One-time: "period": null Monthly Recurring: "period": 1

targeting

No. If left blank, we will target all postings in the account. Targeting options

Properties of the postings the customer would like to sponsor. Everything is AND-ed together, with the exception of requisitionIds, which will be OR-ed with the rest of the targeting criteria.

JSON

targeting.cities

No

List of city/state combos where postings are located that the customer would like to sponsor

list<object>

[ {“name”: “Richmond”, “stateProvCode”: “VA”}, {“name”: “Los Angeles”, “stateProvCode”: “CA”}]

targeting.externalCampaignId

No

The ID of the campaign in the customer's system. This ID will match the ID value passed into the feed.

string

targeting.requisitionIds

No

List of requisition ids the customer would like to sponsor. This id will match the id value passed into the feed.

list<string>

["req1", "req2", "req3"]

targeting.jobDescKeywords

No

List of keywords (case-insensitive) that appear in the job description of postings the customer would like to sponsor.

list<string>

[“back of house”, “#springHiring”]

targeting.jobTitles

No

List of job titles (case-insensitive) of postings the customer would like to sponsor. Note: cashier will target postings that have cashier or cashiers in the title, cashiers will only target postings that have cashiers in the title.

list<string>

[“cashier”, “busser”, “cook”]

targeting.postalCodes

No

List of postal codes where postings are that the customer would like to sponsor.

list<string>

[“90210”, “23060”]

targeting.stateProvCodes

No

List of 2-letter state codes where postings are that the customer would like to sponsor.

list<string>

[“VA”, “CA”]

status

No. If left, blank campaign will remain in its current status.

The status of the campaign "status": 1: Running "status": 2: Archived"status": 3: Paused

number

"status": 3,

Requesting campaign details

Searching for campaigns that match a given criteria

Route that proxies POST /campaigns/search

get
Query parameters
Statusinteger · enumOptional

The campaign's current status

Possible values:
NamestringOptional
Startinteger · int32Optional
Numinteger · int32Optional
Header parameters
X-SAJ-AccountstringOptional

The account identifier provided by Snagajob. Required if X-SAJ-Partner is not provided.

X-SAJ-PartnerstringOptional

A key provided by Snagajob that represents the partner. Required if X-SAJ-Account is not provided.

X-SAJ-PartnerAccountstringOptional

The unique identifier of the partner's account. The value is owned by partner but shared with Snagajob. Required if X-SAJ-Partner is provided.

X-SAJ-DatestringRequired

The date and time of the request in the RFC1123 format (eg: Mon, 31 Oct 2022 20:23:10 GMT). Dates older then 15 minutes will be rejected.

X-SAJ-SignaturestringRequired

A string specific to the request and signed with a private key as described https://docs.snagajob.com/authentication/generating-the-x-saj-signature".

Responses
200
OK
get
GET /v1/campaigns HTTP/1.1
Host: 
X-SAJ-Date: text
X-SAJ-Signature: text
Accept: */*
200

OK

{
  "list": [
    {
      "id": "text",
      "accountId": "text",
      "name": "text",
      "startDate": "2025-07-14T17:30:17.870Z",
      "endDate": "2025-07-14T17:30:17.870Z",
      "budget": 1,
      "autoBidLevel": "text",
      "cpc": 1,
      "maxCpc": 1,
      "period": 0,
      "targeting": {
        "cities": [
          {
            "name": "text",
            "stateProvCode": "text"
          }
        ],
        "externalCampaignId": "text",
        "jobDescKeywords": [
          "text"
        ],
        "jobTitles": [
          "text"
        ],
        "postalCodes": [
          "text"
        ],
        "requisitionIds": [
          "text"
        ],
        "stateProvCodes": [
          "text"
        ]
      },
      "status": 0,
      "spend": 1,
      "sponsoredPostings": 1,
      "leads": 1,
      "paidCpaGoal": 1
    }
  ],
  "total": 1,
  "startNum": 1,
  "endNum": 1,
  "numRequested": 1,
  "fromCache": true,
  "self": "text",
  "elapsed": 1
}

Searching for a Specific Campaign

Route that proxies GET /campaigns/{id}. Returns the Campaign Detail from Api.CampaignManagement, with some fields removed

get
Path parameters
idstringRequired
Header parameters
X-SAJ-AccountstringOptional

The account identifier provided by Snagajob. Required if X-SAJ-Partner is not provided.

X-SAJ-PartnerstringOptional

A key provided by Snagajob that represents the partner. Required if X-SAJ-Account is not provided.

X-SAJ-PartnerAccountstringOptional

The unique identifier of the partner's account. The value is owned by partner but shared with Snagajob. Required if X-SAJ-Partner is provided.

X-SAJ-DatestringRequired

The date and time of the request in the RFC1123 format (eg: Mon, 31 Oct 2022 20:23:10 GMT). Dates older then 15 minutes will be rejected.

X-SAJ-SignaturestringRequired

A string specific to the request and signed with a private key as described https://docs.snagajob.com/authentication/generating-the-x-saj-signature".

Responses
200
OK
get
GET /v1/campaigns/{id} HTTP/1.1
Host: 
X-SAJ-Date: text
X-SAJ-Signature: text
Accept: */*
200

OK

{
  "id": "text",
  "accountId": "text",
  "name": "text",
  "startDate": "2025-07-14T17:30:17.870Z",
  "endDate": "2025-07-14T17:30:17.870Z",
  "budget": 1,
  "autoBidLevel": "text",
  "cpc": 1,
  "maxCpc": 1,
  "period": 0,
  "targeting": {
    "cities": [
      {
        "name": "text",
        "stateProvCode": "text"
      }
    ],
    "externalCampaignId": "text",
    "jobDescKeywords": [
      "text"
    ],
    "jobTitles": [
      "text"
    ],
    "postalCodes": [
      "text"
    ],
    "requisitionIds": [
      "text"
    ],
    "stateProvCodes": [
      "text"
    ]
  },
  "status": 0,
  "spend": 1,
  "sponsoredPostings": 1,
  "leads": 1,
  "paidCpaGoal": 1
}

Updating an Existing Campaign

This section outlines the process for making updates to a campaign. Vendors can edit the name, endDate, budget (or monthly budget if the campaign is recurring), and targeting. The API respects dirty values, so only include the fields you wish to be updated.

Route that proxies PUT /campaigns/{id}

put
Path parameters
idstringRequired
Header parameters
X-SAJ-AccountstringOptional

The account identifier provided by Snagajob. Required if X-SAJ-Partner is not provided.

X-SAJ-PartnerstringOptional

A key provided by Snagajob that represents the partner. Required if X-SAJ-Account is not provided.

X-SAJ-PartnerAccountstringOptional

The unique identifier of the partner's account. The value is owned by partner but shared with Snagajob. Required if X-SAJ-Partner is provided.

X-SAJ-DatestringRequired

The date and time of the request in the RFC1123 format (eg: Mon, 31 Oct 2022 20:23:10 GMT). Dates older then 15 minutes will be rejected.

X-SAJ-SignaturestringRequired

A string specific to the request and signed with a private key as described https://docs.snagajob.com/authentication/generating-the-x-saj-signature".

Body
namestring | nullableOptional

The name of the campaign. Does not need to be unique.

endDatestring · date-time | nullableOptional

The desired end date and time (yyyy-MM-ddThh:mm:ssZ).

budgetnumber · double | nullableOptional

The budget for the campaign. NOTE: For Monthly campaigns (period=1), this value will replenish at the beginning of each calendar month

autoBidLevelstring | nullableOptional

The desired auto bid level.

cpcnumber · double | nullableOptional

The target cost per apply click.

maxCpcnumber · double | nullableOptional

The maximum cost per apply click for dynamic per market pricing

statusinteger · enumOptional

The campaign's current status

Possible values:
paidCpaGoalnumber · double | nullableOptional

The target cost per application which is used to derive a dynamic cost per click

Responses
200
OK
put
PUT /v1/campaigns/{id} HTTP/1.1
Host: 
X-SAJ-Date: text
X-SAJ-Signature: text
Content-Type: application/json-patch+json
Accept: */*
Content-Length: 346

{
  "name": "text",
  "endDate": "2025-07-14T17:30:17.870Z",
  "budget": 1,
  "autoBidLevel": "text",
  "cpc": 1,
  "maxCpc": 1,
  "status": 0,
  "paidCpaGoal": 1,
  "targeting": {
    "cities": [
      {
        "name": "text",
        "stateProvCode": "text"
      }
    ],
    "externalCampaignId": "text",
    "jobDescKeywords": [
      "text"
    ],
    "jobTitles": [
      "text"
    ],
    "postalCodes": [
      "text"
    ],
    "requisitionIds": [
      "text"
    ],
    "stateProvCodes": [
      "text"
    ]
  }
}
200

OK

{
  "id": "text",
  "accountId": "text",
  "name": "text",
  "startDate": "2025-07-14T17:30:17.870Z",
  "endDate": "2025-07-14T17:30:17.870Z",
  "budget": 1,
  "autoBidLevel": "text",
  "cpc": 1,
  "maxCpc": 1,
  "period": 0,
  "targeting": {
    "cities": [
      {
        "name": "text",
        "stateProvCode": "text"
      }
    ],
    "externalCampaignId": "text",
    "jobDescKeywords": [
      "text"
    ],
    "jobTitles": [
      "text"
    ],
    "postalCodes": [
      "text"
    ],
    "requisitionIds": [
      "text"
    ],
    "stateProvCodes": [
      "text"
    ]
  },
  "status": 0,
  "spend": 1,
  "sponsoredPostings": 1,
  "leads": 1,
  "paidCpaGoal": 1
}

Example Budget Update

{
  "budget": 100
}

Example Targeting Update


"targeting":
  {
    "requisitionIds": ["req1", "req2", "req3"]
  }
}

Last updated

Was this helpful?