Docs
API Reference

Listings

Search, browse, create, and manage listings on Markidy.

GET /v1/listings/search

Search listings with filters. All parameters are optional.

Query Parameters

ParameterTypeDescription
qstringSearch query (optional)
categorystringCategory key
rolestringRole key (requires category)
countrystringCountry codes, comma-separated (kr,ja,us)
verifiedintegerVerification level (0, 1, 2)
sortstringrecent (default), trust, views, requests
pageintegerPage number (default: 1)
pageSizeintegerPage size (default: 16, max: 50)
meta.{key}stringSELECT field filter
meta.{key}_minstringNUMBER/DATE min value
meta.{key}_maxstringNUMBER/DATE max value
meta.{key}_latnumberGEO field latitude (use GET /v1/geocode to convert addresses)
meta.{key}_lngnumberGEO field longitude
Examples
# Text search with meta filter
curl "https://api.markidy.com/v1/listings/search?q=agent&meta.language=Python&meta.experience_min=3" \
  -H "Authorization: Bearer mk_your_api_key"

# Browse by category with trust sort
curl "https://api.markidy.com/v1/listings/search?category=ai-agent&role=developer&sort=trust" \
  -H "Authorization: Bearer mk_your_api_key"

# GEO proximity search (sorted by distance)
curl "https://api.markidy.com/v1/listings/search?category=education&meta.location_lat=37.77&meta.location_lng=-122.42" \
  -H "Authorization: Bearer mk_your_api_key"
Response
{
  "listings": [
    {
      "id": "clx...",
      "title": "AI Agent Developer with 5 Years of Python Experience",
      "description": "Specializing in chatbots, RAG pipelines...",
      "categoryKey": "ai-agent",
      "categoryName": "AI Agent",
      "roleKey": "developer",
      "roleName": "AI Developer",
      "verifiedLevel": 1,
      "country": "kr",
      "displayName": "John",
      "distanceKm": 3.2,
      "createdAt": "2026-03-15T10:00:00Z"
    }
  ],
  "total": 45,
  "page": 1,
  "pageSize": 16
}

Response Fields

FieldTypeDescription
idstringListing ID
titlestringDerived from displayTarget: "title" field
descriptionstringFrom displayTarget: "description" field
categoryKeystringCategory identifier
categoryNamestringCategory display name
roleKeystringRole identifier
roleNamestringRole display name
verifiedLevelintegerVerification level (0–2)
countrystringCountry code
displayNamestringDisplay name
createdAtstringISO 8601 timestamp
distanceKmnumber | nullDistance in km when GEO filter is active, null otherwise
GET /v1/listings/{id}

Get detailed listing information including channel availability and your existing request.

Request
curl https://api.markidy.com/v1/listings/clx123 \
  -H "Authorization: Bearer mk_your_api_key"
Response
{
  "listing": {
    "id": "clx...",
    "title": "AI Agent Developer...",
    "description": "Specializing in chatbots...",
    "categoryKey": "ai-agent",
    "roleKey": "developer",
    "meta": { "experience": "5", "language": "Python" },
    "profile": {
      "displayName": "John",
      "description": "Self-introduction...",
      "verifiedLevel": 1,
      "country": "kr"
    },
    "channels": [
      { "key": "markidy", "available": true },
      { "key": "telegram", "available": true },
      { "key": "discord", "available": false, "reason": "requester_not_connected" }
    ],
    "myRequest": null,
    "createdAt": "2026-03-15T10:00:00Z"
  }
}
channels shows per-requester availability. markidy is Markidy's built-in chat — always available: true when listed. External channels (telegram, discord) require both parties to be connected. myRequest is null if no request has been sent.
channels shows per-requester availability. markidy is Markidy's built-in chat — always available: true when listed. External channels (telegram, discord) require both parties to be connected. See Account → Channel Types for details. myRequest is null if no request has been sent.

Additional Fields (vs Search)

FieldTypeDescription
metaobjectDynamic field values
profile.displayNamestringDisplay name
profile.descriptionstringSelf-introduction
profile.verifiedLevelintegerVerification level (0–2)
profile.countrystringCountry code
channels[].keystringChannel identifier
channels[].availablebooleanWhether this channel can be used for request
channels[].reasonstring | nullowner_disconnected — listing owner's channel is inactive. requester_not_connected — your API key's account hasn't connected this channel.
myRequestobject | nullExisting request from current user
myRequest.idstringRequest ID
myRequest.statusstringPENDING, ACCEPTED, REJECTED
GET /v1/listings/mine

List your own listings with optional status filter.

Query Parameters

ParameterTypeDescription
statusstringFilter: ACTIVE, PENDING, PAUSED, REJECTED
pageintegerPage number (default: 1)
pageSizeintegerPage size (default: 16)
Response
{
  "listings": [
    {
      "id": "clx...",
      "status": "ACTIVE",
      "categoryKey": "ai-agent",
      "roleKey": "developer",
      "meta": { "experience": "5", "language": "Python" },
      "createdAt": "2026-03-15T10:00:00Z"
    }
  ],
  "total": 3,
  "page": 1,
  "pageSize": 16
}

Response Fields

FieldTypeDescription
idstringListing ID
statusstringACTIVE, PENDING, PAUSED, REJECTED
categoryKeystringCategory identifier
roleKeystringRole identifier
metaobjectDynamic field values
createdAtstringISO 8601 timestamp
POST /v1/listings

Create a new listing. API-created listings always start as PENDING and require admin approval.

Request Body

FieldTypeRequiredDescription
categoryKeystringCategory key
roleKeystringRole key
metaobjectDynamic field values per role
channelsstring[]Channels to receive requests (must be connected)
webhookIdsstring[]Webhook IDs to trigger on match requests
Request Body
{
  "categoryKey": "ai-agent",
  "roleKey": "developer",
  "meta": { "experience": "5", "language": "Python" },
  "channels": ["telegram", "discord"],
  "webhookIds": ["wh_abc123"]
}
Response (201)
{
  "id": "clx...",
  "status": "PENDING",
  "createdAt": "2026-03-18T12:00:00Z"
}
Listing creation is rate-limited to 5 per hour per API key. Verified Level 2 accounts get 10 per hour.
PATCH /v1/listings/{id}

Update a listing (partial update). Only include fields you want to change.

FieldTypeDescription
metaobjectUpdated field values, merged with existing
channelsstring[]Replaced entirely
webhookIdsstring[]Replaced entirely
Updating a listing resets its status to PENDING for re-approval.
PATCH /v1/listings/{id}/status

Pause or resume a listing.

StatusDescription
PAUSEDHides from search (only ACTIVE listings)
ACTIVEResumes a paused listing
Request Body
{ "status": "PAUSED" }
DELETE /v1/listings/{id}

Permanently delete a listing.

Response
{ "id": "clx...", "deleted": true }