Job description
", "locale": "en", "locationHidden": false, "addressLine1": "123 Fake Street", "addressLine2": "Suite 543", "addressCity": "New York", "addressState": "New York", "addressStateCode": "NY", "addressCountry": "US", "addressZipcode": "10001", "latitude": "40.7481561", "longitude": "-73.9895051", "applyEmail": "test@example.com", "professionalLevel": "PROFESSIONAL", "education": "HIGH_SCHOOL", "isFullTime": true, "isTemporary": false, "isContract": false, "locationType": "ONSITE" } ' \ https://HOST/api/v1/organizations/ORGID/jobs ``` where: - **APIKEY** is the API key - **BILLINGADDRESSID** is the billing address ID (found when getting the list of existing billing addresses) - **HOST** is either `www.idealist.org` to post jobs on the production idealist.org site, or `api-sandbox.idealist.org` to simulate posting in the sandbox - **ORGID** is the organization's ID Sample response: ``` { "job": { "id": "eec0def7e0a8452eb0d9278b7a2b41cb" }, "invoice": { "id": "c3cb8584e4a14ab1ae126d694f432a38", "url": "https://www.idealist.org/invoices/c3cb8584e4a14ab1ae126d694f432a38" } } ``` You've created a new job! 🙌 ## Authentication To authenticate all API endpoint requests, you must obtain a production API key from the Idealist support staff --Job description
", "locale": "en", "jobFunctions": ["COMMUNICATIONS", "COMMUNITY_ORGANIZING"], "areasOfFocus": ["AGRICULTURE", "ANIMALS"], "locationHidden": false, "addressLine1": "123 Fake Street", "addressLine2": "Suite 543", "addressCity": "New York", "addressState": "New York", "addressStateCode": "NY", "addressCountry": "US", "addressZipcode": "10001", "latitude": "40.7481561", "longitude": "-73.9895051", "applyEmail": "test@example.com", "professionalLevel": "PROFESSIONAL", "education": "HIGH_SCHOOL", "isFullTime": true, "isTemporary": false, "isContract": false, "locationType": "REMOTE", "remoteZone": "CITY", "remoteCountry": null } ``` ##### Create Job Fields - Required `name` (string) the title of the job listing. Max length: 1000 characters. `description` (string) HTML markup. Max length: 25000 characters. `latitude` and `longitude` (decimal, positive or negative) example: latitude `40.7125465` longitude `-74.0055648` for New York City. Allows us to show the listing to users looking for jobs around that point. `addressCity` (string) is a human readable city name, like `Pittsburg`. Max length: 255 characters. `addressState` (string) is a human readable state, like `California`. Max length: 100 characters. `addressStateCode` (string) is the standard state abbreviation, like `FL`. Max length: 100 characters. `addressCountry` (string) is the two letter ISO 3166-1 alpha-2 code for the country, like `US`. One of `applyEmail`, `applyUrl` or `applyText` is required. You may provide values for 1, 2 or all 3 fields. - if provided, `applyEmail` (string) must be a valid email address. Max length: 255 characters. - if provided, `applyUrl` (string) must be a valid URL. Max length: 2000 characters. - if provided, `applyText` (string) must contain valid HTML markup. Max length: 25000 characters. `professionalLevel` (string) possible values are: `NONE`, `ENTRY_LEVEL`, `PROFESSIONAL`, `MANAGERIAL`, `EXECUTIVE`, `DIRECTOR` `education` (string) possible values are: `NO_REQUIREMENT`, `HIGH_SCHOOL`, `TWO_YEAR_DEGREE`, `FOUR_YEAR_DEGREE`, `MASTERS_DEGREE`, `JD`, `MD`, `PHD`, `OTHER` `billingAddressId` (string) the billing address ID to use on the invoice. ##### Create Job Fields - Optional `jobFunctions` (array of strings) List of the job functions for this job. Maximum of 5. See [Job Functions](#job-functions) below for the API request to get the list of possible job functions. `areasOfFocus` (array of strings) List of the issue areas for this job. Maximum of 5. See [Issue Areas](#issue-areas) below for the API request to get the list of possible issue areas. `locationHidden` (boolean) when set to `true`, only the city, state and country are shown on the site as the job's location. When set to `false`, `addressLine1` must be provided and will be shown on the site (as well as `addressLine2`, if provided). Default: `false` `addressLine1` (string) required if `locationHidden` is `false`. Max length: 255 characters. `addressLine2` (string) example: `"Floor 11"`. Max length: 255 characters. `addressZipcode` (string) zip code or postal code. Max length: 100 characters. `addressFull` (string) the complete address as a single human-readable line, as you would display it, like `"389 5th Ave, New York, NY 10016, United States"`. Max length: 1000 characters. When omitted, it is built from the other address fields. If `locationHidden` is `true`, omit it or make sure it does not contain the street address, because it is displayed as provided. `benefits` (string) HTML markup. Max length: 25000 characters. `salaryMinimum` (integer | float | string) minimum compensation, in the currency and for the period given by `salaryCurrency` and `salaryPeriod`. example: `20000`, `"20000.00"`, `20000.00`. `salaryMaximum` (integer | float | string) maximum compensation, in the same currency and for the same period. Must be greater than or equal to `salaryMinimum`. example: `30000`, `"30000.00"`, `30000.00`. `salaryCurrency` (string) Three letter ISO 4217 currency code. example: `"USD"`, `"EUR"`, `"CAD"`, `"GBP"`. Required if `salaryPeriod` is provided. `salaryPeriod` (string) The period the compensation is for: `"YEAR"`, `"MONTH"`, `"WEEK"`, `"DAY"`, `"HOUR"`. Required if `salaryCurrency` is provided. If a salary is provided without `salaryCurrency` and `salaryPeriod`, both are filled in for backward compatibility: the currency is `USD`, and the period is `HOUR` when the salary is 500 or less and `YEAR` otherwise. When editing a job that already has a currency and period, those are kept. You should always provide both fields explicitly. `salaryDetails` (string) plain text, not HTML. Max length: 255 characters. `languageProficiency` (string) HTML markup. Max length: 25000 characters. `locale` (string) One of `"en"` (English), `"es"` (Spanish), `"pt"` (Portuguese). The language used in the listing. `applicationDeadline` (ISO date) example: `"2017-07-15"` `autoHide` (boolean) when `true`, the job is hidden automatically after its application deadline. Requires `applicationDeadline`. The job is hidden about 24 hours after the end of the deadline day in the job's local time, and can be unhidden with the [Unhide Job](#unhide-job) endpoint. Default: `false` `startDate` (ISO date) example: `"2017-07-15"` `endDate` (ISO date) example: `"2017-07-15"`. If `startDate` is specified, must be after `startDate`. `isFullTime` (boolean) default: `false` `isTemporary` (boolean) default: `false` `isContract` (boolean) default: `false` `locationType` (string) One of `"ONSITE"`, `"REMOTE"`, `"HYBRID"`. Defaults to `"ONSITE"` when omitted. When `"ONSITE"`, the `remoteZone`, `remoteState` and `remoteCountry` fields are ignored and stored as `null`. `remoteZone` (string) Where the job can be performed from. One of `"WORLD"`, `"COUNTRY"`, `"STATE"`, `"CITY"`. - For `"REMOTE"` jobs, all four values are accepted. Defaults to `"WORLD"` when omitted. - For `"HYBRID"` jobs, only `"CITY"` and `"STATE"` are accepted. Defaults to `"CITY"` when omitted. `"COUNTRY"` requires `remoteCountry`. `"STATE"` requires `remoteState` and sets `remoteCountry` to `"US"`. `remoteState` (string) The US state for a `"STATE"` zone. Two letter state code, like `"NY"`. The 50 states and `"DC"` are accepted; US territories are not. Stored as `null` for other zones. `remoteCountry` (string) The country for a `"COUNTRY"` zone. Two letter ISO 3166-1 alpha-2 code, like `"US"`. Required if `remoteZone` is `"COUNTRY"`. Set automatically to `"US"` if `remoteZone` is `"STATE"`. `null` for other values of `remoteZone`. ##### Create Job Fields - Available to recruiter organizations only Organizations of the type "Recruiter" can post job listings either on behalf of other organizations (i.e., jobs posted by recruiters can have any organization's name attached to them) and "anonymously" (i.e., posted jobs will not show any organization's name) On the `idealist.org` production site, these fields can only be set by organizations of type "Recruiter". On the `api-sandbox.idealist.org` sandbox, all test organizations are allowed to set these fields. Note: If you wish to change the organization type of an organization in production, contact us. Fields: `hasOrgNameOverride` (boolean) whether to post on behalf of another organization `orgNameOverride` (string) if `hasOrgNameOverride` is `true`, this is the name of the organization that the job is posted on behalf of (leave `null` to post job with no organization name, i.e. "anonymously"). Max length: 1000 characters. #### Create a job (continued) If the post is successful, the server will respond with HTTP status `201`. Sample response: ```json { "job": { "id": "eec0def7e0a8452eb0d9278b7a2b41cb" }, "invoice": { "id": "c3cb8584e4a14ab1ae126d694f432a38", "url": "https://www.idealist.org/invoices/c3cb8584e4a14ab1ae126d694f432a38" } } ``` Note: on the API sandbox, fetching the invoice URL (returned as part of the response after creating a job -- see above) will return a 404. Invoice URLs on the production site will work. On the API sandbox, the `job.id` value (returned as part of the response -- see above) can be used to fetch the job using the [Get Job](#get-job) call, just as on the production site. #### Get Job `GET /api/v1/organizations/{org_id}/jobs/{job_id}` Sample response: ```json { "job": { "id": "eec0def7e0a8452eb0d9278b7a2b41cb", "created": "2026-09-25T15:04:25.640039Z", "updated": "2026-09-25T15:04:25.640039Z", "status": ["PUBLISHED"], "name": "Job Name", "hasOrgNameOverride": false, "orgNameOverride": null, "description": "Job description
", "locale": "en", "expires": "2026-10-25T15:04:25.639246Z", "creator": null, "deleted": null, "isPublished": true, "firstPublished": "2026-09-25T15:04:25.640039Z", "jobFunctions": ["COMMUNICATIONS", "COMMUNITY_ORGANIZING"], "areasOfFocus": ["AGRICULTURE", "ANIMALS"], "locationHidden": false, "addressFull": "123 Fake Street, New York, NY 10001, United States", "addressLine1": "123 Fake Street", "addressLine2": "Suite 543", "addressCity": "New York", "addressState": "New York", "addressStateCode": "NY", "addressZipcode": "10001", "addressCountry": "US", "latitude": 40.748156, "longitude": -73.989505, "applyEmail": "test@example.com", "applyUrl": null, "applyText": null, "benefits": null, "salaryMinimum": "50000.00", "salaryMaximum": "60000.00", "salaryCurrency": "USD", "salaryPeriod": "YEAR", "salaryDetails": null, "professionalLevel": "PROFESSIONAL", "languageProficiency": null, "education": "HIGH_SCHOOL", "applicationDeadline": "2026-10-15", "autoHide": true, "autoHideAfter": "2026-10-17T04:00:00Z", "startDate": null, "endDate": null, "isFullTime": true, "isTemporary": false, "isContract": false, "locationType": "REMOTE", "remoteZone": "CITY", "remoteState": null, "remoteCountry": null, "url": { "en": "https://www.idealist.org/en/eec0def7e0a8452eb0d9278b7a2b41cb-example", "es": "https://www.idealist.org/es/eec0def7e0a8452eb0d9278b7a2b41cb-ejemplo" } } } ``` `autoHideAfter` is the datetime after which the job will be hidden when `autoHide` is `true`, or `null`. Note: on the API sandbox, `autoHideAfter` is computed and returned, but the job is never actually hidden. #### Edit Job `PUT /api/v1/organizations/{org_id}/jobs/{job_id}` Sample request body: ```json { "name": "Job Name", "description": "Job description
", "locale": "en", "jobFunctions": ["COMMUNICATIONS", "COMMUNITY_ORGANIZING"], "areasOfFocus": ["AGRICULTURE", "ANIMALS"], "applyEmail": "test@example.com", "professionalLevel": "PROFESSIONAL", "education": "HIGH_SCHOOL", "isFullTime": true, "isTemporary": false, "isContract": false, "locationType": "ONSITE" } ``` The fields are the same as when creating a job, except `billingAddressId`, which is not used when editing. The address is replaced as a whole. If the request contains none of the address fields (`locationHidden`, `addressFull`, `addressLine1`, `addressLine2`, `addressCity`, `addressState`, `addressStateCode`, `addressCountry`, `addressZipcode`, `latitude`, `longitude`), the job keeps its current address. If it contains any of them, the same address fields are required as when creating a job, and any optional address field left out is cleared. Note that you can edit jobs through the API only if the job has been published and is not archived or deleted. #### Delete Job `DELETE /api/v1/organizations/{org_id}/jobs/{job_id}` You should receive a `204 No Content` response. If you `GET` a deleted job, you will see that the `deleted` attribute is now a datetime string instead of `null`. For example: ``` { "job": { // ... "deleted": "2017-10-10T20:49:50.162464Z", // ... } } ``` #### Hide Job `POST /api/v1/organizations/{org_id}/jobs/{job_id}/hide` You can hide a published job by posting to the above URL. It's not possible to hide a job that is not currently published. #### Unhide Job `POST /api/v1/organizations/{org_id}/jobs/{job_id}/unhide` You can unhide a hidden job by posting to the above URL. It's not possible to unhide a job that is not currently hidden. If a job has been hidden but would then be unpublished for other reasons (deleted, or expired), it's no longer possible to unhide the it. ### Job Functions `GET /api/v1/job-functions?lang={en|es}` Returns all the possible job functions. You should query this list to make sure you have the lastest list of possible job functions. Sample response: ```json { "jobFunctions": [{ "id": "ACCOUNTING_FINANCE", "text": "Accounting & Finance" }, { "id": "ADMINISTRATIVE", "text": "Administrative" }, { "id": "ADVOCACY", "text": "Advocacy" }, // ... truncated { "id": "WRITING_EDITORIAL", "text": "Writing/Editorial" }] } ``` ### Issue areas (areas of focus) `GET /api/v1/areas-of-focus?lang={en|es}` Returns all the possible areas of focus. You should query this list to make sure you have the lastest list of possible areas of focus. Sample response: ```json { "areasOfFocus": [ {"id": "AGRICULTURE", "text": "Agriculture"}, {"id": "ANIMALS", "text": "Animals"}, {"id": "ARTS_MUSIC", "text": "Arts & Music"}, {"id": "CHILDREN_YOUTH", "text": "Children & Youth"}, // ... truncated {"id": "WOMEN", "text": "Women"} ] } ``` ### Note on HTML sanitization The HTML strings are sanitized for security and styling reasons. The following tags are currently allowed: - `h2` - `h3` - `h4` - `h5` - `h6` - `ul` - `ol` - `li` - `p` - `br` - `a` - `strong` - `em` - `u` - `b` - `s` - `span` - `div` - `sub` - `sup` - `blockquote` - `i` ## Changelog - 2026-09-25 Update the Get Job sample response with all the documented fields. - 2026-09-25 Document `autoHide` and `autoHideAfter`. - 2026-09-25 Document `addressFull`. - 2026-09-25 Clarify `locationType`, `remoteZone`, `remoteState` and `remoteCountry`: defaults, and which fields are ignored. - 2026-09-25 Fix `salaryDetails` docs: plain text, max length 255 characters. - 2026-09-25 Document that `salaryCurrency` and `salaryPeriod` must be provided together, and what happens when both are omitted. - 2026-09-25 Document that the address can be edited. Sending no address field keeps the current address. - 2026-09-25 Remove `remoteOk` from the field reference. It is still accepted for backward compatibility, but `locationType` should be used. - 2025-05-19 Update list of supported HTML tags. Add "Posting API" name. - 2024-12-10 Add `areasOfFocus`. - 2024-06-20 Add `endDate`. - 2024-06-20 Add `salaryCurrency` and `salaryPeriod`. Update `salaryMinimum` and `salaryMaximum` type. - 2024-01-24 Remove `remoteTemporary` and `remoteTemporaryCovid` fields and remove `REMOTE_TEMPORARY` as option from `locationType` as positions are no longer expected to be temporarily remote. - 2022-10-10 Add `locationType`. Deprecate `remoteOk` and `remoteTemporary`. - 2022-03-29 Add `locale`. - 2022-02-24 Update docs for `professionalLevel` (add `DIRECTOR`). - 2022-02-24 Update validation of "remote" fields to match changes made to production. - 2021-11-11 Update docs to note `remoteOk` and `remoteTemporaryCovid` are mutually exclusive. - 2021-11-03 Updated examples to use `remoteTemporary` instead of `remoteTemporaryCovid`. - 2021-10-08 Added `remoteZone`, `remoteCountry`, and `remoteTemporaryCovid` to api examples. - 2021-10-05 Added `remoteTemporary` in favor of `remoteTemporaryCovid` since we will support positions that are temporarily remote post-covid. - 2021-03-04 Updated to include `remoteZone`, `remoteCountry` and `remoteTemporaryCovid`. - 2019-09-26 Remove API for volunteer opportunities. - 2018-10-17 Add Note on HTML sanitization section. - 2018-06-20 Updated introduction and support email address and instructions. - 2018-06-16 Add documentation about volunteer opportunities new `addressDescription` field. - 2017-12-07 Add documentation about volunteer opportunities and hiding-unhiding listings. - 2017-10-09 Add missing documentation for deleting a job. - 2017-10-01 Add job functions and the possibility to edit and delete a job. Add max length of fields. - 2017-07-27 More information on production API launch date, more info on `orgNameOverride`. - 2017-07-20 Copy fixes and clarifications. - 2017-07-19 Initial version.