Skip to main content

Listings

In Directify, listings are the items that appear in your directory. These can be tools, services, products, or any other items you want to showcase. The API endpoints use “projects” in the URL, but they refer to listings in your directory.

Get Directory Listings

Retrieve all listings for a specific directory with pagination.
Parameters:
  • directory_id (integer, required): The ID of the directory
  • page (integer, optional): Page number for pagination (default: 1)
Response:

Get Single Listing

Retrieve a specific listing by ID.
Parameters:
  • directory_id (integer, required): The ID of the directory
  • project_id (integer, required): The ID of the listing
Response:

Check Listing Exists

Check if a listing with a specific URL already exists in the directory.
Parameters:
  • directory_id (integer, required): The ID of the directory
Request Body:
Response (Listing exists):
Response (Listing doesn’t exist):

Create Listing

Create a new listing in the directory.
Parameters:
  • directory_id (integer, required): The ID of the directory
Request Body:
Linking organizers: Pass organizers as an array of organizer IDs to associate the listing with one or more organizers (agencies, studios, event hosts, etc.). Only organizers belonging to the same directory are linked — any IDs from another directory are silently ignored. Fetch available IDs with GET /api/directories/{directory_id}/organizers.
Expiring listings: starts_at and ends_at control when a listing is visible. A listing with a starts_at in the future stays hidden until that moment, and once ends_at passes it is either badged as expired or hidden entirely — depending on the directory’s expiring listings setting. Both are optional; omit them and the listing is live immediately and never expires. Accepts any date format PHP can parse, e.g. 2026-08-01 09:00:00 or 2026-08-01T09:00:00Z.
Response:

Bulk Create Listings

Create multiple listings in a single request. Up to 100 listings can be created at once. Each listing is processed independently, so if one fails, the others will still be created.
Parameters:
  • directory_id (integer, required): The ID of the directory
Request Body:
Available fields per listing: Custom field values can also be passed by using the custom field name as the key (e.g., "pricing": "Free", "founded_year": "2020").
additional_image_urls vs additional_images_urls — these differ by a single letter and are not the same thing:
  • additional_image_urls (image, singular) is the writable field. Send gallery images hosted elsewhere as an array of URLs.
  • additional_images_urls (images, plural) is read-only, and appears in responses only. It is the listing’s complete gallery: images uploaded through the dashboard (returned as CDN URLs) followed by everything in additional_image_urls.
Read additional_images_urls when you want to render the gallery. Write additional_image_urls when you want to change it. Sending additional_images_urls does nothing.
When a url is provided, the API uses it for duplicate detection. If a listing with the same URL already exists in the directory, it will be returned as-is instead of creating a duplicate.
Response (201 Created):
Response with partial errors:

Update Listing

Update an existing listing.
Parameters:
  • directory_id (integer, required): The ID of the directory
  • project_id (integer, required): The ID of the listing
Request Body:
Pass ends_at: null to remove an expiry date and make a listing permanent again.
Response:
Partial updates: When updating a listing, you only need to send the fields you want to change. Fields that are omitted from the request body will remain unchanged. Importantly, if you omit categories, tags, or organizers from a PUT request, the existing assignments will be preserved. To explicitly clear them, send empty arrays: "categories": [], "tags": [], or "organizers": [].

Delete Listing

Delete a listing from the directory.
Parameters:
  • directory_id (integer, required): The ID of the directory
  • project_id (integer, required): The ID of the listing
Response: