Send link request to another member
POST /api/members/{memberId}/link-requests
Success: 200 OK
- Products: Operator (
FOH), Consumer (CONSUMER) (any one of these products, not all) - Features: Online Bookings (
ONLINEBOOK), Online Joining (ONLINEJOIN), Front of House Generic Access (FOHGENERIC) (any one of these features, not all)
Overview
Invites another existing member to be linked to this one, so the two accounts can share memberships and book for each other. The invitation is pending until the other member accepts it with Accept a link request from a primary member; nothing is linked by this call alone.
You identify the other member by their personal details, not by their member id. All four fields must match a member record: first name and last name compared case-insensitively, email compared exactly, and date of birth matched to the day. If no member matches, the request fails with 404 — which in practice means "these details do not identify anyone", not "that person has no account".
The rules the sender and receiver must satisfy are strict, and each has its own status code:
- The sender must not already be a secondary member of someone else's link (
409). - The receiver must not be a primary member, and must not already be linked to anyone (
409). - The receiver must be at or above the tenant's age of consent (
400). Juniors are linked by other means, not by invitation. - You cannot invite yourself, invite someone already linked to you, or send a second invitation to the same person while the first is pending (
400). - The sender's existing links and pending requests together are capped by the tenant's maximum-linked-members setting. Note the check is
existing + pending >= maximum − 1, so the effective ceiling is one below the configured number.
On success a message is published internally, which is what triggers the notification to the invited member.
Linked members are permitted — a token issued for a member linked to {memberId} may call this endpoint.
Endpoint
POST {base_url}/api/members/{memberId}/link-requests
{base_url} is the environment URL issued to your integration. See Authenticating with Gladstone APIs.
Path parameters
| Name | Type | Required | Description |
|---|---|---|---|
memberId | integer (int32) | Yes | The member sending the invitation. Must match the member id in your access token, or be a member linked to it. This member becomes the primary of the link if the invitation is accepted. |
Request body
All four fields identify the member being invited, and all four are used in the lookup — omitting any of them will fail to match.
| Field | Type | Required | Description |
|---|---|---|---|
firstName | string | Yes | The invited member's first name(s) as recorded on their account. Compared case-insensitively, but not trimmed or fuzzy-matched, so it must otherwise be exact. |
lastName | string | Yes | The invited member's surname as recorded on their account. Compared case-insensitively. |
dateOfBirth | string (date-time) | Yes | The invited member's date of birth. Matched to within a day either side, so the time component does not matter. Also used for the age-of-consent check, which uses this value, not the date of birth stored on the matched account. |
email | string | Yes | The invited member's home email address. Compared exactly, including case, so it must be reproduced as they registered it. |
Sample request
curl -X POST '{base_url}/api/members/{memberId}/link-requests' \
-H 'Authorization: Bearer {accessToken}' \
-H 'X-Use-SSO: true' \
-H 'Content-Type: application/json' \
-d '{
"firstName": "string",
"lastName": "string",
"dateOfBirth": "2026-08-14T19:00:00Z",
"email": "member@example.com"
}'Response fields
This action returns the single link request it created — a flat object with id, firstName, lastName, createdOn, senderMemberId, receiverMemberId and email — not the sent/received envelope shown below. That envelope is the shape returned by Get pending link requests for member; the two share a response type in the schema. Build against the flat object, and use the pending-requests endpoint if you need both directions.
| Field | Type | Description |
|---|---|---|
sent | array of object | Invitations this member has sent and that are still awaiting a response. Populated by the pending-requests endpoint, not by this one. |
sent[].id | integer (int32) | The link request's id. Pass it to Delete link request to withdraw the invitation. |
sent[].firstName | string | The invited member's first name. |
sent[].lastName | string | The invited member's surname. |
sent[].createdOn | string (date-time) | When the invitation was created. Stamped from the server's local clock, not UTC. |
sent[].senderMemberId | integer (int32) | The member who sent the invitation — the one who becomes primary if it is accepted. |
sent[].receiverMemberId | integer (int32) | The member who was invited, resolved from the personal details you supplied. This is how you learn their member id. |
sent[].email | string | The email address the invitation was matched on. |
received | array of object | Invitations sent to this member by others and still awaiting their response. Populated by the pending-requests endpoint, not by this one. |
received[].id | integer (int32) | The link request's id, for accepting or declining it. |
received[].firstName | string | The inviting member's first name. |
received[].lastName | string | The inviting member's surname. |
received[].createdOn | string (date-time) | When the invitation was created. |
received[].senderMemberId | integer (int32) | The member who sent the invitation. |
received[].receiverMemberId | integer (int32) | The member who was invited — this member. |
received[].email | string | The inviting member's email address. |
Sample response
{
"sent": [
{
"id": 12345,
"firstName": "string",
"lastName": "string",
"createdOn": "2026-08-14T19:00:00Z",
"senderMemberId": 12345,
"receiverMemberId": 12345,
"email": "member@example.com"
}
],
"received": [
{
"id": 12345,
"firstName": "string",
"lastName": "string",
"createdOn": "2026-08-14T19:00:00Z",
"senderMemberId": 12345,
"receiverMemberId": 12345,
"email": "member@example.com"
}
]
}Errors
| Status | Meaning | When |
|---|---|---|
400 | Bad request | The invited member is below the tenant's age of consent: Age of consent is greater than the age of the member. |
400 | Bad request | The details identify the sender: You cannot send a link request to yourself. |
400 | Bad request | The two members are already linked: This link already exists between {senderId} and {receiverId} |
400 | Bad request | An identical invitation is already pending: The request link between {senderId} and {receiverId} was already sent. |
400 | Bad request | The sender's links plus pending invitations have reached the tenant's cap: Maximum limit of linked members for this member has been reached |
404 | Not found | No member matches the four personal details supplied: The member with the ID: 0 does not exist. |
404 | Not found | The sending member does not exist: The sender member: {memberId}, does not exists in the database. |
409 | Conflict | The sender is already a secondary member in someone else's link: The member with ID:{memberId} is a secondary one. |
409 | Conflict | The invited member is already linked to someone: The receiver member {receiverId} is already linked to another member |
409 | Conflict | The invited member is a primary of their own link group: The member with ID:{receiverId} is a primary one. |
500 | Internal server error | The link request could not be saved, the notification could not be sent, or an unexpected server-side failure occurred. |