API-Referenz
Alle Endpunkte, Parameter und Antworten der API, erzeugt aus der OpenAPI-Beschreibung.
Diese Seite entsteht beim Build aus derselben Beschreibung, die GET /v1/openapi.json ausliefert. Sie kann deshalb nicht von der API abweichen. Zusammenfassungen und Feldbeschreibungen sind Englisch wie die API selbst. Wie Schlüssel, Rechte, Seiten und Fehler funktionieren, steht unter Einstieg.
Adresse: https://api.casttool.net
Maschinenlesbare Beschreibung (OpenAPI 3.1): https://api.casttool.net/v1/openapi.json
Endpunkte
GET /v1/me
Tenant and scopes of the API key in use
Recht des Schlüssels: jeder gültige Schlüssel
Antworten
200Tenant and scopes of the API key in useMe401Missing, unknown, revoked or expired API keyError403The key lacks the scope, or the tenant is suspendedError429Too many requestsError
GET /v1/models
List models, ordered by id
Recht des Schlüssels: models:read
Parameter
| Feld | Ort | Typ | Pflicht | Hinweise |
|---|---|---|---|---|
limit | query | integer | Number of items on one page · default 50, minimum 1, maximum 100 | |
cursor | query | string | `nextCursor` of the previous page | |
status | query | "active" | "inactive" | Only models with this status |
Antworten
200List models, ordered by idModelPage400Invalid inputError401Missing, unknown, revoked or expired API keyError403The key lacks the scope, or the tenant is suspendedError429Too many requestsError
POST /v1/models
Create a model. It starts inactive and is published in the dashboard.
Recht des Schlüssels: models:write
Inhalt der Anfrage (JSON)
| Feld | Typ | Pflicht | Hinweise |
|---|---|---|---|
firstName | string | ja | minLength 1, maxLength 100 |
lastName | string | ja | minLength 1, maxLength 100 |
email | string (email) | ja | maxLength 254 |
mobile | string | null | maxLength 50 | |
landline | string | null | maxLength 50 | |
address | string | null | maxLength 500 | |
dateOfBirth | string (date) | null | ||
gender | string | null | maxLength 200 | |
pronouns | string | null | maxLength 200 | |
category | string | null | maxLength 200 | |
bodyType | string | null | maxLength 200 | |
eyeColor | string | null | maxLength 200 | |
hairColor | string | null | maxLength 200 | |
ethnicIdentity | string | null | maxLength 200 | |
hasDriverLicense | boolean | ||
specialFeatures | string | null | maxLength 5000 | |
currentLocation | string[] | maxItems 100 | |
dialects | string[] | maxItems 100 | |
ethnicOrigins | string[] | maxItems 100 | |
languages | string[] | maxItems 100 | |
nationalities | string[] | maxItems 100 | |
previousClients | string[] | maxItems 100 | |
talents | string[] | maxItems 100 | |
measurements | object | ||
measurements.height | string | number | maxLength 40 | |
measurements.weight | string | number | maxLength 40 | |
measurements.bust | string | number | maxLength 40 | |
measurements.waist | string | number | maxLength 40 | |
measurements.hip | string | number | maxLength 40 | |
measurements.shoeSize | string | number | maxLength 40 | |
measurements.dressSize | string | number | maxLength 40 | |
measurements.jeansSize | string | number | maxLength 40 | |
socialMedia | object | ||
socialMedia.instagram | string | maxLength 300 | |
socialMedia.tiktok | string | maxLength 300 | |
socialMedia.youtube | string | maxLength 300 | |
socialMedia.twitch | string | maxLength 300 |
Antworten
201Create a model. It starts inactive and is published in the dashboard. Without the scope `models:read` the response is `ModelWriteReceipt`.ModelResponse | ModelWriteReceipt400Invalid inputError401Missing, unknown, revoked or expired API keyError402The subscription only allows readingError403The key lacks the scope, or the tenant is suspendedError409The address is already registered in this tenantError429Too many requestsError
GET /v1/models/{id}
Read one model
Recht des Schlüssels: models:read
Parameter
| Feld | Ort | Typ | Pflicht | Hinweise |
|---|---|---|---|---|
id | path | string | ja | Identifier of the resource |
Antworten
200Read one modelModelResponse400Invalid inputError401Missing, unknown, revoked or expired API keyError403The key lacks the scope, or the tenant is suspendedError404Not found in this tenantError429Too many requestsError
PATCH /v1/models/{id}
Change the profile of a model. Status and visibility stay in the dashboard. A date of birth under 18 takes a public profile offline until a parent has given consent.
Recht des Schlüssels: models:write
Parameter
| Feld | Ort | Typ | Pflicht | Hinweise |
|---|---|---|---|---|
id | path | string | ja | Identifier of the resource |
Inhalt der Anfrage (JSON)
| Feld | Typ | Pflicht | Hinweise |
|---|---|---|---|
firstName | string | minLength 1, maxLength 100 | |
lastName | string | minLength 1, maxLength 100 | |
email | string (email) | maxLength 254 | |
mobile | string | null | maxLength 50 | |
landline | string | null | maxLength 50 | |
address | string | null | maxLength 500 | |
dateOfBirth | string (date) | null | ||
gender | string | null | maxLength 200 | |
pronouns | string | null | maxLength 200 | |
category | string | null | maxLength 200 | |
bodyType | string | null | maxLength 200 | |
eyeColor | string | null | maxLength 200 | |
hairColor | string | null | maxLength 200 | |
ethnicIdentity | string | null | maxLength 200 | |
hasDriverLicense | boolean | ||
specialFeatures | string | null | maxLength 5000 | |
currentLocation | string[] | maxItems 100 | |
dialects | string[] | maxItems 100 | |
ethnicOrigins | string[] | maxItems 100 | |
languages | string[] | maxItems 100 | |
nationalities | string[] | maxItems 100 | |
previousClients | string[] | maxItems 100 | |
talents | string[] | maxItems 100 | |
measurements | object | ||
measurements.height | string | number | maxLength 40 | |
measurements.weight | string | number | maxLength 40 | |
measurements.bust | string | number | maxLength 40 | |
measurements.waist | string | number | maxLength 40 | |
measurements.hip | string | number | maxLength 40 | |
measurements.shoeSize | string | number | maxLength 40 | |
measurements.dressSize | string | number | maxLength 40 | |
measurements.jeansSize | string | number | maxLength 40 | |
socialMedia | object | ||
socialMedia.instagram | string | maxLength 300 | |
socialMedia.tiktok | string | maxLength 300 | |
socialMedia.youtube | string | maxLength 300 | |
socialMedia.twitch | string | maxLength 300 |
Antworten
200Change the profile of a model. Status and visibility stay in the dashboard. A date of birth under 18 takes a public profile offline until a parent has given consent. Without the scope `models:read` the response is `ModelWriteReceipt`.ModelResponse | ModelWriteReceipt400Invalid inputError401Missing, unknown, revoked or expired API keyError402The subscription only allows readingError403The key lacks the scope, or the tenant is suspendedError404Not found in this tenantError409The address is already registered in this tenantError429Too many requestsError
GET /v1/inquiries
List inquiries, ordered by id
Recht des Schlüssels: inquiries:read
Parameter
| Feld | Ort | Typ | Pflicht | Hinweise |
|---|---|---|---|---|
limit | query | integer | Number of items on one page · default 50, minimum 1, maximum 100 | |
cursor | query | string | `nextCursor` of the previous page | |
status | query | "open" | "accepted" | "rejected" | "booked" | Only inquiries with this status |
Antworten
200List inquiries, ordered by idInquiryPage400Invalid inputError401Missing, unknown, revoked or expired API keyError403The key lacks the scope, or the tenant is suspendedError429Too many requestsError
GET /v1/inquiries/{id}
Read one inquiry
Recht des Schlüssels: inquiries:read
Parameter
| Feld | Ort | Typ | Pflicht | Hinweise |
|---|---|---|---|---|
id | path | string | ja | Identifier of the resource |
Antworten
200Read one inquiryInquiryResponse400Invalid inputError401Missing, unknown, revoked or expired API keyError403The key lacks the scope, or the tenant is suspendedError404Not found in this tenantError429Too many requestsError
GET /v1/bookings
List confirmed bookings, ordered by id
Recht des Schlüssels: bookings:read
Parameter
| Feld | Ort | Typ | Pflicht | Hinweise |
|---|---|---|---|---|
limit | query | integer | Number of items on one page · default 50, minimum 1, maximum 100 | |
cursor | query | string | `nextCursor` of the previous page |
Antworten
200List confirmed bookings, ordered by idBookingPage400Invalid inputError401Missing, unknown, revoked or expired API keyError403The key lacks the scope, or the tenant is suspendedError429Too many requestsError
GET /v1/bookings/{id}
Read one confirmed booking
Recht des Schlüssels: bookings:read
Parameter
| Feld | Ort | Typ | Pflicht | Hinweise |
|---|---|---|---|---|
id | path | string | ja | Identifier of the resource |
Antworten
200Read one confirmed bookingBookingResponse400Invalid inputError401Missing, unknown, revoked or expired API keyError403The key lacks the scope, or the tenant is suspendedError404Not found in this tenantError429Too many requestsError
Antworten im Detail
Error
| Feld | Typ | Pflicht | Hinweise |
|---|---|---|---|
error | object | ja | |
error.code | string | ja | Stable, machine-readable reason |
error.message | string | ja | |
error.issues | object[] | Only for `validation_failed` | |
error.issues[].path | string | ja | |
error.issues[].message | string | ja |
Me
| Feld | Typ | Pflicht | Hinweise |
|---|---|---|---|
tenant | object | ja | |
tenant.id | string (uuid) | ja | |
tenant.slug | string | ja | |
tenant.name | string | ja | |
tenant.kind | "agency" | "casting" | ja | |
key | object | ja | |
key.id | string | ja | |
key.scopes | "models:read" | "models:private" | "models:write" | "inquiries:read" | "bookings:read"[] | ja |
ModelPage
| Feld | Typ | Pflicht | Hinweise |
|---|---|---|---|
data | object[] | ja | |
data[].id | string | ja | |
data[].firstName | string | ja | |
data[].lastName | string | ja | |
data[].status | "active" | "inactive" | ja | |
data[].isPublic | boolean | ja | |
data[].featured | boolean | ja | |
data[].category | string | null | ja | |
data[].age | integer | null | ja | Only for public models |
data[].gender | string | null | ja | |
data[].pronouns | string | null | ja | |
data[].bodyType | string | null | ja | |
data[].eyeColor | string | null | ja | |
data[].hairColor | string | null | ja | |
data[].hasDriverLicense | boolean | ja | |
data[].specialFeatures | string | null | ja | |
data[].currentLocation | string[] | ja | |
data[].languages | string[] | ja | |
data[].dialects | string[] | ja | |
data[].nationalities | string[] | ja | |
data[].talents | string[] | ja | |
data[].previousClients | string[] | ja | |
data[].measurements | object | ja | |
data[].measurements.height | string | ||
data[].measurements.weight | string | ||
data[].measurements.bust | string | ||
data[].measurements.waist | string | ||
data[].measurements.hip | string | ||
data[].measurements.shoeSize | string | ||
data[].measurements.dressSize | string | ||
data[].measurements.jeansSize | string | ||
data[].socialMedia | object | ja | |
data[].socialMedia.instagram | string | ||
data[].socialMedia.tiktok | string | ||
data[].socialMedia.youtube | string | ||
data[].socialMedia.twitch | string | ||
data[].images | object | ja | Published images only. Files waiting for approval have no address here. |
data[].images.profileImage | string (uri) | null | ja | |
data[].images.galleryImages | string (uri)[] | ja | |
data[].private | object | Only with the scope `models:private` | |
data[].private.email | string | null | ja | |
data[].private.mobile | string | null | ja | |
data[].private.landline | string | null | ja | |
data[].private.address | string | null | ja | |
data[].private.dateOfBirth | string | null | ja | |
data[].private.ethnicIdentity | string | null | ja | |
data[].private.ethnicOrigins | string[] | ja | |
data[].createdAt | string (date-time) | ja | |
data[].updatedAt | string (date-time) | ja | |
nextCursor | string | null | ja | Pass as `cursor` for the next page, null on the last one |
ModelResponse
| Feld | Typ | Pflicht | Hinweise |
|---|---|---|---|
model | object | ja | |
model.id | string | ja | |
model.firstName | string | ja | |
model.lastName | string | ja | |
model.status | "active" | "inactive" | ja | |
model.isPublic | boolean | ja | |
model.featured | boolean | ja | |
model.category | string | null | ja | |
model.age | integer | null | ja | Only for public models |
model.gender | string | null | ja | |
model.pronouns | string | null | ja | |
model.bodyType | string | null | ja | |
model.eyeColor | string | null | ja | |
model.hairColor | string | null | ja | |
model.hasDriverLicense | boolean | ja | |
model.specialFeatures | string | null | ja | |
model.currentLocation | string[] | ja | |
model.languages | string[] | ja | |
model.dialects | string[] | ja | |
model.nationalities | string[] | ja | |
model.talents | string[] | ja | |
model.previousClients | string[] | ja | |
model.measurements | object | ja | |
model.measurements.height | string | ||
model.measurements.weight | string | ||
model.measurements.bust | string | ||
model.measurements.waist | string | ||
model.measurements.hip | string | ||
model.measurements.shoeSize | string | ||
model.measurements.dressSize | string | ||
model.measurements.jeansSize | string | ||
model.socialMedia | object | ja | |
model.socialMedia.instagram | string | ||
model.socialMedia.tiktok | string | ||
model.socialMedia.youtube | string | ||
model.socialMedia.twitch | string | ||
model.images | object | ja | Published images only. Files waiting for approval have no address here. |
model.images.profileImage | string (uri) | null | ja | |
model.images.galleryImages | string (uri)[] | ja | |
model.private | object | Only with the scope `models:private` | |
model.private.email | string | null | ja | |
model.private.mobile | string | null | ja | |
model.private.landline | string | null | ja | |
model.private.address | string | null | ja | |
model.private.dateOfBirth | string | null | ja | |
model.private.ethnicIdentity | string | null | ja | |
model.private.ethnicOrigins | string[] | ja | |
model.createdAt | string (date-time) | ja | |
model.updatedAt | string (date-time) | ja |
ModelWriteReceipt
| Feld | Typ | Pflicht | Hinweise |
|---|---|---|---|
model | object | ja | Without the scope `models:read` only id and timestamp, the profile stays unreadable |
model.id | string | ja | |
model.updatedAt | string (date-time) | ja |
InquiryPage
| Feld | Typ | Pflicht | Hinweise |
|---|---|---|---|
data | object[] | ja | |
data[].id | string | ja | |
data[].status | "open" | "accepted" | "rejected" | "booked" | ja | |
data[].offerStatus | "pending" | "accepted" | "rejected" | null | ja | |
data[].name | string | null | ja | |
data[].email | string | null | ja | |
data[].phone | string | null | ja | |
data[].company | string | null | ja | |
data[].contactPerson | string | null | ja | |
data[].project | string | null | ja | |
data[].category | string | null | ja | |
data[].type | string | null | ja | |
data[].poNumber | string | null | ja | |
data[].budget | object | ja | |
data[].budget.dailyFee | string | null | ja | |
data[].budget.travelAndFitting | string | null | ja | |
data[].budget.overtime | string | null | ja | |
data[].budget.buyout | string | null | ja | |
data[].fittingDate | object | ja | |
data[].fittingDate.date | string | null | ja | |
data[].fittingDate.location | string | null | ja | |
data[].fittingDate.description | string | null | ja | |
data[].recallDate | object | ja | |
data[].recallDate.date | string | null | ja | |
data[].recallDate.location | string | null | ja | |
data[].recallDate.description | string | null | ja | |
data[].shootingDates | object[] | ja | |
data[].shootingDates[].date | string | null | ja | |
data[].shootingDates[].location | string | null | ja | |
data[].shootingDates[].description | string | null | ja | |
data[].models | object[] | ja | |
data[].models[].id | string | ja | |
data[].models[].name | string | ja | |
data[].models[].responseStatus | "pending" | "available" | "tentative" | "booked" | "unavailable" | ja | |
data[].models[].respondedAt | string (date-time) | null | ja | |
data[].createdAt | string (date-time) | ja | |
data[].updatedAt | string (date-time) | ja | |
nextCursor | string | null | ja | Pass as `cursor` for the next page, null on the last one |
InquiryResponse
| Feld | Typ | Pflicht | Hinweise |
|---|---|---|---|
inquiry | object | ja | |
inquiry.id | string | ja | |
inquiry.status | "open" | "accepted" | "rejected" | "booked" | ja | |
inquiry.offerStatus | "pending" | "accepted" | "rejected" | null | ja | |
inquiry.name | string | null | ja | |
inquiry.email | string | null | ja | |
inquiry.phone | string | null | ja | |
inquiry.company | string | null | ja | |
inquiry.contactPerson | string | null | ja | |
inquiry.project | string | null | ja | |
inquiry.category | string | null | ja | |
inquiry.type | string | null | ja | |
inquiry.poNumber | string | null | ja | |
inquiry.budget | object | ja | |
inquiry.budget.dailyFee | string | null | ja | |
inquiry.budget.travelAndFitting | string | null | ja | |
inquiry.budget.overtime | string | null | ja | |
inquiry.budget.buyout | string | null | ja | |
inquiry.fittingDate | object | ja | |
inquiry.fittingDate.date | string | null | ja | |
inquiry.fittingDate.location | string | null | ja | |
inquiry.fittingDate.description | string | null | ja | |
inquiry.recallDate | object | ja | |
inquiry.recallDate.date | string | null | ja | |
inquiry.recallDate.location | string | null | ja | |
inquiry.recallDate.description | string | null | ja | |
inquiry.shootingDates | object[] | ja | |
inquiry.shootingDates[].date | string | null | ja | |
inquiry.shootingDates[].location | string | null | ja | |
inquiry.shootingDates[].description | string | null | ja | |
inquiry.models | object[] | ja | |
inquiry.models[].id | string | ja | |
inquiry.models[].name | string | ja | |
inquiry.models[].responseStatus | "pending" | "available" | "tentative" | "booked" | "unavailable" | ja | |
inquiry.models[].respondedAt | string (date-time) | null | ja | |
inquiry.createdAt | string (date-time) | ja | |
inquiry.updatedAt | string (date-time) | ja |
BookingPage
| Feld | Typ | Pflicht | Hinweise |
|---|---|---|---|
data | object[] | ja | |
data[].id | string | ja | |
data[].inquiryId | string | ja | |
data[].terms | object | ja | |
data[].terms.dailyFee | string | null | ja | |
data[].terms.travelAndFitting | string | null | ja | |
data[].terms.overtime | string | null | ja | |
data[].terms.buyout | string | null | ja | |
data[].models | object[] | ja | |
data[].models[].id | string | ja | |
data[].models[].name | string | ja | |
data[].confirmedAt | string (date-time) | ja | |
nextCursor | string | null | ja | Pass as `cursor` for the next page, null on the last one |
BookingResponse
| Feld | Typ | Pflicht | Hinweise |
|---|---|---|---|
booking | object | ja | |
booking.id | string | ja | |
booking.inquiryId | string | ja | |
booking.terms | object | ja | |
booking.terms.dailyFee | string | null | ja | |
booking.terms.travelAndFitting | string | null | ja | |
booking.terms.overtime | string | null | ja | |
booking.terms.buyout | string | null | ja | |
booking.models | object[] | ja | |
booking.models[].id | string | ja | |
booking.models[].name | string | ja | |
booking.confirmedAt | string (date-time) | ja |