All contact endpoints require a valid authenticated session and email verification. Destructive operations (delete, bulk delete) are restricted to theDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/0m1n3m/contacts-db/llms.txt
Use this file to discover all available pages before exploring further.
admin role; creating and editing contacts requires at least the editor role. Listing, viewing, and exporting contacts are available to any authenticated user.
GET /contacts
Returns the paginated contact list rendered as an HTML Blade view. Supports rich column-level filtering, global search, sorting, and configurable page size via query parameters. Role: any authenticated userGlobal search string. Matches against
organisation_name, first_name, last_name, job_title, stakeholder_type, comment, relevant_project_programme, contact_category, relationship_status, country, and all JSON array fields (emails, phones, keywords, organisation_types, expertise_speaking_topics).Column to sort by. Allowed values:
contact_category, relationship_status, use_for_events, potential_speaker, organisation_name, first_name, last_name, job_title, country, relevant_project_programme, stakeholder_type, created_at, updated_at. Unknown values fall back to updated_at.Sort direction.
asc or desc.Results per page. Accepted values:
10, 25, 50, 100. Any other value falls back to 25.Case-insensitive substring filter on the
first_name column.Case-insensitive substring filter on the
last_name column.Case-insensitive substring filter on the
organisation_name column.Case-insensitive substring filter on the
stakeholder_type column.Case-insensitive substring filter on the
comment column.Case-insensitive substring filter on
relevant_project_programme.Case-insensitive substring filter on the
job_title column.Case-insensitive substring filter on
contact_category.Case-insensitive substring filter on
relationship_status.Filter by event flag. Accepted truthy values:
1, true, yes, y, on. Accepted falsy values: 0, false, no, n, off.Filter by speaker flag. Same truthy/falsy values as
use_for_events.Filter by country. Pass a 2-letter ISO code (e.g.
DE) for an exact match, or a country name substring (e.g. germany) which is resolved against the countries config to find the matching ISO code(s).Search for a value inside the JSON
emails array. Pass a plain string — the query wraps it in JSON string delimiters ("value") before performing the LIKE match.Search for a value inside the JSON
phones array.Search for a value inside the JSON
keywords array.Search for a value inside the JSON
organisation_types array.Search for a value inside the JSON
expertise_speaking_topics array.contacts.index). Query string parameters are preserved in pagination links.
POST /contacts
Creates a new contact record. Role: admin or editorContent-Type:
application/x-www-form-urlencoded or multipart/form-data
Category label for the contact. Maximum 255 characters.
Relationship status label. Maximum 255 characters.
Contact’s first name. Maximum 255 characters.
Contact’s last name. Maximum 255 characters.
Organisation or company name. Maximum 255 characters.
Job title or role. Maximum 255 characters.
One email address per line. The server splits on newlines and stores the result as a JSON array in the
emails column.One phone number per line. Stored as a JSON array in the
phones column.2-letter ISO country code or full country name. Maximum 255 characters.
One organisation type per line. Stored as a JSON array.
One keyword per line. Stored as a JSON array.
One topic per line. Stored as a JSON array.
Project or programme association. Maximum 255 characters.
Stakeholder classification. Maximum 255 characters.
Free-text notes. No length limit enforced at the route level.
Whether to include this contact in event mailing lists.
Whether this contact is a potential speaker.
302 redirect to GET /contacts on success. Validation errors redirect back with $errors in the session.
GET /contacts/
Displays the detail view for a single contact. Role: any authenticated userRoute model binding: resolves by primary key
id.
Response: HTML view (contacts.show). Returns 404 if the contact does not exist.
GET /contacts//edit
Displays the edit form for a contact. Role: admin or editor Response: HTML view (contacts.edit). Returns 403 for viewers.
PATCH /contacts/
Updates an existing contact. Accepts the same body fields asPOST /contacts.
Role: admin or editorContent-Type:
application/x-www-form-urlencoded (include _method=PATCH for HTML forms) or send a true PATCH request.
All fields follow the same validation rules as POST /contacts. contact_category and relationship_status remain required.
Response: 302 redirect to GET /contacts/{id} on success.
DELETE /contacts/
Permanently deletes a single contact record. Role: admin only Response:302 redirect to GET /contacts with a status flash message "Contact deleted.". Returns 403 for non-admin users.
POST /contacts/bulk-destroy
Permanently deletes multiple contacts in a single atomic database transaction. Role: admin onlyArray of integer contact IDs to delete. Must contain at least one entry. All IDs must exist in the
contacts table.302 redirect to GET /contacts with a status flash message indicating how many records were deleted (e.g. "Deleted 5 contact(s)."). Returns 403 for non-admin users.
POST /contacts/export
Streams a CSV download of the selected contacts. Role: any authenticated userArray of integer contact IDs to include in the export. Must contain at least one entry. All IDs must exist in the
contacts table.- UTF-8 BOM prepended so that Excel opens the file correctly
- Filename pattern:
contacts-selected-YYYYMMDD-HHmmss.csv - Header row:
id, contact_category, relationship_status, use_for_events, potential_speaker, organisation_name, first_name, last_name, job_title, emails, phones, country, organisation_types, keywords, relevant_project_programme, expertise_speaking_topics, stakeholder_type, comment, created_at, updated_at - JSON array columns (
emails,phones,organisation_types,keywords,expertise_speaking_topics) are serialised as compact JSON arrays in each cell - Boolean columns (
use_for_events,potential_speaker) are exported as1or0 - Records are ordered by
iddescending and streamed in chunks of 500 rows
200 with Content-Type: text/csv; charset=UTF-8 and Content-Disposition: attachment.
GET /contacts/import
Displays the CSV/spreadsheet import upload form. Role: admin or editor Response: HTML view (contacts.import.create).
POST /contacts/import/preview
Accepts a spreadsheet file, validates it, and returns a column-mapping preview view. The file is stored temporarily on the server; its path is returned for use in the subsequentrun call.
Role: admin or editorContent-Type:
multipart/form-data
The file to import. Accepted MIME types:
text/csv, text/plain, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet (xlsx), application/vnd.ms-excel (xls). Maximum size: 10 MB.run request.
POST /contacts/import/run
Executes the import using the mapping confirmed in the preview step. Role: admin or editorThe server-side temporary file path returned by the
preview step.Object mapping Contacts DB field names (keys) to the corresponding column headers in the uploaded file (values). For example:
{"first_name": "First Name", "emails_text": "Email"}.302 redirect with a flash message summarising import results (rows imported, rows skipped, errors encountered).