# Forms
Read-only access to the Forms app: the forms in your account and the applications (submissions) they have received.
NOTE
These endpoints are read-only. Forms are created and edited from the Wolfeo interface.
# List Forms
GET https://api.wolfeo.me/v1/forms
Returns a paginated list of the forms in your account, each with the total number of
submissions it has received. Use it to discover the id to pass to /form and
/form-submissions.
# Example Request
curl --request GET "https://api.wolfeo.me/v1/forms?status=published" \
--header "Authorization: Bearer YOUR_API_KEY"
# Parameters
| Parameter | Type | Description |
|---|---|---|
| status | string | Filter by form status (see possible values below) |
| page | integer | Page number (default: 1) |
| per_page | integer | Results per page, max 100 (default: 50) |
# Possible values for status
| Value | Description |
|---|---|
draft | Not published yet, not reachable by visitors |
published | Live and accepting submissions |
archived | Retired, no longer accepting submissions |
# Sample Return
{
"success": true,
"data": [
{
"id": 1,
"type": "candidature",
"name": "Projet 2DAY",
"status": "published",
"submissions_count": 42,
"created_at": "2026-06-01T09:12:00.000000Z"
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"per_page": 50,
"total": 3
}
}
TIP
Forms are returned most recent first. submissions_count counts every submission,
including the ones still in_progress.
# Possible Errors
| Code | HTTP | Description |
|---|---|---|
| INVALID_STATUS | 400 | status is not one of draft, published, archived |
| VALIDATION_ERROR | 422 | Invalid page or per_page |
| UNAUTHORIZED | 401 | Invalid or missing API key |
# Get Form
GET https://api.wolfeo.me/v1/form
Returns one form with its questions and its outcomes. Read it before filtering
submissions on an answer: /form-submissions expects a question_id, and this is
where you find it.
# Example Request
curl --request GET "https://api.wolfeo.me/v1/form?id=1" \
--header "Authorization: Bearer YOUR_API_KEY"
# Parameters
| Parameter | Type | Description |
|---|---|---|
| id* | integer | The form id |
* denotes a required parameter
# Sample Return
{
"success": true,
"data": {
"id": 1,
"type": "candidature",
"name": "Projet 2DAY",
"status": "published",
"questions": [
{
"id": 7,
"label": "Can a coach contact you on WhatsApp?",
"type": "yes_no",
"options": null
},
{
"id": 8,
"label": "What is your monthly budget?",
"type": "single_choice",
"options": ["Under 500", "500 to 2000", "Over 2000"]
}
],
"outcomes": [
{
"key": "ideal",
"title": "Profil idéal",
"bucket": "hot"
}
]
}
}
TIP
options is null for question types that carry no predefined choices, such as
yes_no or free text. When present, it lists the option labels in display order.
# Possible Errors
| Code | HTTP | Description |
|---|---|---|
| NOT_FOUND | 404 | No form with this id in your account |
| VALIDATION_ERROR | 422 | id is missing or not an integer |
| UNAUTHORIZED | 401 | Invalid or missing API key |
# List Form Submissions
GET https://api.wolfeo.me/v1/form-submissions
Returns a paginated list of submissions. Each row carries the prospect's identity,
score, qualification bucket, status and dates, but not the per-question answers,
the phone number or the AI summary. Fetch those one submission at a time through
/form-submission.
# Example Request
curl --request GET "https://api.wolfeo.me/v1/form-submissions?form_id=1&bucket=hot&status=completed" \
--header "Authorization: Bearer YOUR_API_KEY"
# Parameters
| Parameter | Type | Description |
|---|---|---|
| form_id | integer | Only submissions of this form |
| status | string | completed or in_progress |
| bucket | string | hot, warm or cold |
| score_min | number | Only submissions scoring at or above this value |
| contact_id | integer | Only submissions linked to this contact |
| string | Only submissions whose linked contact has this email | |
| period | string | Time range on the creation date (see possible values below) |
| range | string | Custom date range, only used when period=between |
| updated_after | string | Only submissions updated at or after this ISO datetime |
| question_id | integer | Question to filter an answer on, required by the two below |
| answer | string | Exact answer to that question |
| answer_contains | string | Substring of the answer to that question |
| include_attribution | boolean | Include the ad attribution object (default: false) |
| sort | string | created_at or score (default: created_at) |
| order | string | asc or desc (default: desc) |
| page | integer | Page number (default: 1) |
| per_page | integer | Results per page, max 100 (default: 50) |
# Possible values for period
| Value | Description |
|---|---|
all | All submissions ever |
today | Submissions created today |
yesterday | Submissions created yesterday |
last7days | Submissions created in the last 7 days |
last30days | Submissions created in the last 30 days |
between | Custom date range (requires range) |
# Format for range
Pass two dates separated by to:
2026-06-01to2026-06-29
# Sample Return
{
"success": true,
"data": [
{
"id": 1024,
"form_id": 1,
"status": "completed",
"score": 15,
"bucket": "hot",
"outcome_key": "ideal",
"contact": {
"id": 812,
"email": "john.doe@example.com",
"first_name": "John",
"last_name": "Doe"
},
"started_at": "2026-06-12T10:02:11.000000Z",
"completed_at": "2026-06-12T10:07:48.000000Z",
"created_at": "2026-06-12T10:02:11.000000Z",
"updated_at": "2026-06-12T10:07:48.000000Z"
}
],
"meta": {
"current_page": 1,
"last_page": 5,
"per_page": 50,
"total": 247
}
}
TIP
score is a raw point total, the sum of the answers' points. It is not a 0 to 100
scale, and its ceiling depends on how the form is scored. Use bucket when you need
a comparable hot / warm / cold signal.
WARNING
Poll with updated_after rather than period. A submission left in_progress and
completed days later keeps its original creation date, so a filter on period will
never show it again, while updated_after will.
# Possible Errors
| Code | HTTP | Description |
|---|---|---|
| INVALID_STATUS | 400 | status is neither completed nor in_progress |
| INVALID_BUCKET | 400 | bucket is not hot, warm or cold |
| MISSING_QUESTION_ID | 400 | answer or answer_contains sent without question_id |
| INVALID_PERIOD | 400 | Unrecognised period, or between without a valid range |
| VALIDATION_ERROR | 422 | A parameter has the wrong type |
| UNAUTHORIZED | 401 | Invalid or missing API key |
# Get Form Submission
GET https://api.wolfeo.me/v1/form-submission
Returns the full detail of a single submission: the contact card including the phone number, the score with its resolved outcome title, the per-question answers, the AI summary and the ad attribution. This is the only endpoint that exposes the answers and the phone number.
# Example Request
curl --request GET "https://api.wolfeo.me/v1/form-submission?id=1024" \
--header "Authorization: Bearer YOUR_API_KEY"
# Parameters
| Parameter | Type | Description |
|---|---|---|
| id* | integer | The submission id |
* denotes a required parameter
# Sample Return
{
"success": true,
"data": {
"id": 1024,
"form_id": 1,
"form": {
"id": 1,
"name": "Projet 2DAY",
"type": "candidature"
},
"status": "completed",
"score": 15,
"bucket": "hot",
"outcome_key": "ideal",
"contact": {
"id": 812,
"email": "john.doe@example.com",
"first_name": "John",
"last_name": "Doe",
"phone": "+33 600000000",
"company_name": "Doe Consulting"
},
"qualification": {
"bucket": "hot",
"outcome_key": "ideal",
"title": "Profil idéal"
},
"ai_summary": "Runs a 3-person consultancy, budget above 2000, wants to start in September.",
"attribution": {
"utm_source": "facebook",
"utm_campaign": "leads-june",
"ad_id": "23861234567890123"
},
"answers": [
{
"question_id": 7,
"label": "Can a coach contact you on WhatsApp?",
"type": "yes_no",
"answer": "yes",
"score": 5
}
],
"started_at": "2026-06-12T10:02:11.000000Z",
"completed_at": "2026-06-12T10:07:48.000000Z",
"created_at": "2026-06-12T10:02:11.000000Z",
"updated_at": "2026-06-12T10:07:48.000000Z"
}
}
TIP
ai_summary is null until the summary has been generated, and completed_at is
null while the submission is still in_progress.
# Possible Errors
| Code | HTTP | Description |
|---|---|---|
| NOT_FOUND | 404 | No submission with this id in your account |
| VALIDATION_ERROR | 422 | id is missing or not an integer |
| UNAUTHORIZED | 401 | Invalid or missing API key |