A request with no Authorization header.
Expected. UNAUTHORIZED, and the message says the API key is missing.
Contract checks
Safe cases should not create records. A pass means the live response matched the documented code, message, or shape.
Sends parallel reads of the join form. The budget is 120 a minute for the whole key. Keep the count small unless you mean to trip it.
A request with no Authorization header.
Expected. UNAUTHORIZED, and the message says the API key is missing.
Authorization is present, but the token is empty.
Expected. UNAUTHORIZED.
A well-shaped key that was never issued.
Expected. UNAUTHORIZED, and the message says the API key is invalid. This is different from a deleted key.
Sends Token instead of Bearer.
Expected. UNAUTHORIZED.
The production key must never be attached to a path that leaves the documented API.
Expected. The console blocks the call before it leaves this app.
A newline in a header is request smuggling fuel, so the console refuses to send it. The API also forbids line breaks in this key.
Expected. The console blocks the header.
The community has one form, with fields and rules, and one email field.
Expected. 200, success envelope, fields, rules, and an email field.
A small page request.
Expected. 200 and a page envelope.
100 is the documented maximum page size.
Expected. 200 and a page envelope.
101 is past the documented maximum of 100.
Expected. VALIDATION_ERROR.
A five-digit page size should not be silently accepted.
Expected. VALIDATION_ERROR.
Zero is not a page size.
Expected. VALIDATION_ERROR.
A negative page size.
Expected. VALIDATION_ERROR.
A word where a page size belongs.
Expected. VALIDATION_ERROR.
Pages start at 1.
Expected. VALIDATION_ERROR.
A negative page number.
Expected. VALIDATION_ERROR.
A word where a page number belongs.
Expected. VALIDATION_ERROR.
page=1.5 is not an integer page.
Expected. VALIDATION_ERROR, or a documented decision to truncate. A 500 is a failure.
A very high page number should be an empty page, not an error, unless the API documents otherwise.
Expected. 200 and a page whose items are empty, or a validation error. A 500 is a failure.
Every documented status is a legal filter, including when nothing matches.
Expected. 200 and a page of invitations.
Every documented status is a legal filter, including when nothing matches.
Expected. 200 and a page of invitations.
Every documented status is a legal filter, including when nothing matches.
Expected. 200 and a page of invitations.
Every documented status is a legal filter, including when nothing matches.
Expected. 200 and a page of invitations.
Every documented status is a legal filter, including when nothing matches.
Expected. 200 and a page of invitations.
Every documented status is a legal filter, including when nothing matches.
Expected. 200 and a page of invitations.
Every documented status is a legal filter, including when nothing matches.
Expected. 200 and a page of invitations.
status=not_a_status is not in the enum.
Expected. VALIDATION_ERROR. An empty 200 is worth a review, not a pass.
PENDING is not the documented value pending.
Expected. VALIDATION_ERROR if matching is case-sensitive. Record the actual behavior.
Deleted invitations leave the list. The delete is a webhook, not a status.
Expected. VALIDATION_ERROR. Do not expect a deleted row.
slack is one of the four documented platforms.
Expected. 200 and a page.
sms is not a platform.
Expected. VALIDATION_ERROR.
An address that should not exist in the community.
Expected. 200 and a page. Items should be empty if matching is exact.
extra=1 should be ignored or rejected. It must not 500.
Expected. 200 page, or VALIDATION_ERROR.
Event lists use the same page envelope and do not include lead_form.
Expected. 200 and a page.
The page maximum applies to events too.
Expected. VALIDATION_ERROR.
The header is defined for invitation and applicant creates. Other calls ignore it.
Expected. 200 form response. The header does not change the read.
An object with none of the required fields.
Expected. VALIDATION_ERROR, and no invitation is created.
Every other field is present, mode is not.
Expected. VALIDATION_ERROR, and no invitation is created.
mode=invite is not send or submit.
Expected. VALIDATION_ERROR, and no invitation is created.
SEND is not send.
Expected. VALIDATION_ERROR, and no invitation is created.
mode is submit and email is absent. The address is also invalid so a bug cannot deliver.
Expected. VALIDATION_ERROR, and no invitation is created.
not-an-email should fail before a record is stored.
Expected. VALIDATION_ERROR, and no invitation is created.
An address hundreds of characters long.
Expected. VALIDATION_ERROR, and no invitation is created.
Platforms are required.
Expected. VALIDATION_ERROR, and no invitation is created.
An empty platform list.
Expected. VALIDATION_ERROR, and no invitation is created.
sms is not slack, discord, telegram, or whatsapp.
Expected. VALIDATION_ERROR, and no invitation is created.
The same platform twice. Email is also invalid, so this must not create a record either way.
Expected. VALIDATION_ERROR, and no invitation is created.
answers must be an object of strings.
Expected. VALIDATION_ERROR, and no invitation is created.
Answer values are strings, not numbers.
Expected. VALIDATION_ERROR, and no invitation is created.
A truncated JSON body.
Expected. VALIDATION_ERROR, and no invitation is created.
The content type is text/plain.
Expected. VALIDATION_ERROR, and no invitation is created.
The body is [].
Expected. VALIDATION_ERROR, and no invitation is created.
The documented maximum is 128 characters. The email is also invalid.
Expected. VALIDATION_ERROR, and no invitation is created.
Spaces are forbidden. The email is also invalid, so nothing should be stored.
Expected. VALIDATION_ERROR, and no invitation is created.
A 24-character hex id that does not exist.
Expected. NOT_FOUND, Invitation not found.
Sent as one encoded path segment, so this checks id handling rather than routing.
Expected. NOT_FOUND or VALIDATION_ERROR. A 500 is a failure.
PATCH must not create an invitation for an unknown id.
Expected. NOT_FOUND.
Reject on an unknown id.
Expected. NOT_FOUND.
Retry is confirmed locally because the route can deliver, and the id is synthetic.
Expected. NOT_FOUND.
Approve is confirmed locally because the route can deliver, and the id is synthetic.
Expected. NOT_FOUND.
The id is synthetic. Run-all never deletes an id you have saved.
Expected. NOT_FOUND. A 204 here would mean a real record was deleted.
A synthetic event id.
Expected. NOT_FOUND, Event not found.
Listing registrations for an unknown event.
Expected. NOT_FOUND.
Both ids are synthetic.
Expected. NOT_FOUND.
A valid-looking body on an event that does not exist.
Expected. NOT_FOUND, and no applicant is stored.
Title and slug are both missing.
Expected. VALIDATION_ERROR, and no event is created.
Slug alone is not enough, and this slug is not a slug.
Expected. VALIDATION_ERROR.
If this is accepted, a real event is created. Delete it from the response id.
Expected. VALIDATION_ERROR. A 201 means the slug rules are looser than a URL slug and a record now exists.
The contract says these cannot both be true. A 201 leaves a real event behind.
Expected. VALIDATION_ERROR.
Not/AZone is not an IANA timezone. A 201 leaves a real event behind.
Expected. VALIDATION_ERROR.
ends_at is a day before starts_at. A 201 leaves a real event behind.
Expected. VALIDATION_ERROR if the schedule is checked. Record a 201 as a product decision and delete the event.
hybrid is not physical or online.
Expected. VALIDATION_ERROR.
Replacing the live form without an email field. Run this only after you have loaded the current form in the playground, so you can restore it if the API wrongly accepts the body.
Expected. VALIDATION_ERROR, and a following read shows the previous form.
An empty field list removes every question, including email, if it is accepted.
Expected. VALIDATION_ERROR.
The contract says not to send name or email next to data. Uses the fixture event.
Expected. VALIDATION_ERROR, and no applicant is created.
An empty object on a real event.
Expected. VALIDATION_ERROR.
Use a sent, rejected, approved, or delivery_failed id from the fixture bar.
Expected. CONFLICT. The message says it can only be edited while pending or awaiting verification.
If the fixture invitation is delivery_failed, this will deliver again. Use a pending or sent id to expect a conflict.
Expected. CONFLICT unless the status is delivery_failed.
Do this with a spare key, not the only key this console is using.
Expected. UNAUTHORIZED, and the message says the API key was deleted.
Only meaningful on a community that is not on Pro.
Expected. PLAN_LIMIT, and the message says the Customer API is available on the Pro plan.
The console cannot wait 24 hours for you.
Expected. The same key creates a new record after 24 hours.
A reused key returns the first person even when the body email changes.
Expected. The scenario “Event and applicant lifecycle” checks this. Run that, or follow the steps.
Other clients using the same key share the budget. Use the burst probe on this page.
Expected. RATE_LIMITED, and details.retry_after_seconds says when to retry.
Watch Webhooks while you edit a form or an event.
Expected. No delivery for the save. Invitation and applicant changes do emit.
The API is not the only source of webhooks.
Expected. A public join or a dashboard action shows up on Webhooks with a valid signature.
Force a non-2xx response only long enough to see one retry.
Expected. A later delivery has the same X-Inviter-Event-Id and is marked as a duplicate.
API submit follows required fields, auto-approval, and email verification only.
Expected. submit succeeds even when the public page would block the visitor.
Use the playground with mode=send and a mailbox plus a connected platform.
Expected. 201, and the status is sent or delivery_failed. It should not stay pending.