PlanDocket

Applications

Business+

Manage applications for events.

Required scopes: applications
Access level: GET applications:read POST / PUT / PATCH / DELETE applications:write About access levels
Approving also creates a contact and therefore additionally requires the "contacts:write" scope.

Endpoints

GET /api/v1/applications

List all applications

GET /api/v1/applications/{id}

Retrieve a single application

PUT/PATCH /api/v1/applications/{id}

Update an application

DELETE /api/v1/applications/{id}

Move an application to the trash (restorable by an admin)

POST /api/v1/applications/{id}/approve

Approve an application: creates the contact with portal access, moves events, categories, notes, custom fields and files to it and fires the application.approved webhook. The contact gets no password: the applicant receives a portal invitation (a set-password link valid for 7 days, in the applicant's language). Optional body {"send_invitation": false} skips the invitation (it can be sent later from the admin contact page). Like in the admin area, the applicant is admitted as participant of the events applied for: "event_ids" limits this to some of them ([] admits none), "confirm" (default: the tenant setting auto_confirm_on_admit, normally false) confirms the participation right away and "notify" (default true) sends the participation e-mail; admitting needs the "participants:write" scope. Returns contact_id, username, invitation_sent, invitation_status, admitted_events, not_admitted_events (e.g. event full, with code and error) and partial_success. 409 if a contact with the email already exists or the application was already decided, 422 without a valid email, 403 when the plan's contact limit is reached

POST /api/v1/applications/{id}/reject

Reject an application: removes it and its files permanently (unlike DELETE, which moves it to the trash) and fires the application.rejected webhook. Optional body: {"notify": true, "reason": "..."} emails the applicant (reason max. 2000 characters)

Query Parameters

Parameter Description
search Search term to filter results
category_key Filter by category key
event_key Filter by event key
sort Sort field (company_name, last_name, email, city, rating, created_at)
order Sort direction (ASC or DESC, default: DESC)
include Include related data (events, categories)

Request Schema

Parameter Type Required Description
company_name string No Company name
first_name string No First name
last_name string No Last name
email string No Email address
phone string No Phone number
address string No Street address
postal_code string No Postal code
city string No City
country string No Country code
website string No Website URL
tax_id string No Tax identification number
rating integer No Application rating (1-5)

Response Schema

Field Type
id integer
company_name string|null
first_name string|null
last_name string|null
address string|null
postal_code string|null
city string|null
country string|null
state string|null
phone string|null
fax string|null
mobile string|null
email string|null
website string|null
notes string|null
tax_id string|null
rating integer
created_at string
updated_at string

Code Examples

curl -X GET "https://your-tenant.plandocket.com/api/v1/applications" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Accept: application/json"
<?php
$apiKey = 'YOUR_API_KEY';
$baseUrl = 'https://your-tenant.plandocket.com';

$ch = curl_init();
curl_setopt_array($ch, [
    CURLOPT_URL => $baseUrl . '/api/v1/applications',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $apiKey,
    ],
]);

$response = curl_exec($ch);
curl_close($ch);

$data = json_decode($response, true);
print_r($data);
const apiKey = 'YOUR_API_KEY';
const baseUrl = 'https://your-tenant.plandocket.com';

const response = await fetch(`${baseUrl}/api/v1/applications`, {
  method: 'GET',
  headers: {
    'Authorization': `Bearer ${apiKey}`,
  },
});

const data = await response.json();
console.log(data);
import requests

api_key = 'YOUR_API_KEY'
base_url = 'https://your-tenant.plandocket.com'

headers = {
    'Authorization': f'Bearer {api_key}',
}

response = requests.get(f'{base_url}/api/v1/applications', headers=headers)
data = response.json()
print(data)

Sample Response

200 OK
{
    "data": [
        {
            "id": 1,
            "company_name": "string",
            "first_name": "string",
            "last_name": "string",
            "address": "string",
            "postal_code": "string",
            "city": "string",
            "country": "string",
            "state": "string",
            "phone": "string",
            "fax": "string",
            "mobile": "string",
            "email": "string",
            "website": "string",
            "notes": "string",
            "tax_id": "string",
            "rating": 1,
            "created_at": "2026-01-15T10:00:00+01:00",
            "updated_at": "2026-01-15T10:00:00+01:00"
        }
    ],
    "meta": {
        "current_page": 1,
        "per_page": 25,
        "total": 1,
        "total_pages": 1
    }
}