List applications
List program applications endpoint
GET /api/v1/admin/programs/<programSlug>/applications
Exports applications to a specific program as JSON.
Returns one page of submitted applications for the program, newest first. The key must
hold a READ grant for this program. Filters apply to submit_time. When revisionState
is omitted both CURRENT and OBSOLETE applications are returned.
API key ID as the username, key secret as the password.
The program's URL slug, as shown in the admin UI and in the generated per-program API docs.
rental-assistanceInclusive lower bound on submit_time. Accepts an ISO-8601 instant with zone
(2026-09-01T00:00:00Z), a local date-time without zone (2026-09-01T00:00:00,
interpreted in the deployment's configured time zone), or a date (2026-09-01,
start of that day in the deployment's time zone).
2026-09-01T00:00:00ZExclusive upper bound on submit_time. Same formats as fromDate.
2026-10-01T00:00:00ZCURRENT is the applicant's latest submission for the program. OBSOLETE is an earlier
submission that a later one replaced.
Positive integer. Applications per page. When omitted, the deployment's configured maximum is used (default 1000). Larger values are not reduced in the current version; stay at or below 1000. Zero and negative values are not validated and fail with a server error today.
200The nextPageToken from the previous page. Opaque and signed; do not construct or
modify it. It carries the program, filters and page size of the request that produced
it. A parameter the token already carries may be repeated only with the same value;
a different value returns 400. fromDate, toDate and pageSize may be omitted
when following a token. revisionState must be repeated when the first request set
it: omitting it is read as "both states" and returns 400 against a token that
carries one. A filter the token does not carry may be added and is applied from that
page on. Using a token against a different program returns 401 when the key lacks a
grant there, otherwise 400.
One page of applications.
Pass as nextPageToken to fetch the next page. Null on the last page.
A parameter failed validation. The body is a plain-text message. Cases include a
malformed fromDate or toDate, an unrecognized revisionState, a program that is not
an application program, a nextPageToken whose signature does not verify, a token
issued for a different program that the key can read, and a token repeated with
different fromDate, toDate or pageSize values. An unknown program slug returns
401, not 400, because the key cannot hold a grant for it.
The key is missing, retired, expired, used from an address outside its subnet allowlist,
presented with a wrong secret, or lacks a READ grant for the program. An unknown program
slug also returns 401, since no key can hold a grant for it. The body is empty.
GET /api/v1/admin/programs/{programSlug}/applications HTTP/1.1
Host: civiform.example.gov
Authorization: Basic username:password
Accept: */*
{
"payload": [
{
"program_name": "rental_assistance",
"program_version_id": 412,
"applicant_id": 9031,
"application_id": 22817,
"language": "en-US",
"create_time": "2026-09-14T09:12:33-04:00",
"submitter_type": "APPLICANT",
"ti_email": null,
"ti_organization": null,
"submit_time": "2026-09-14T09:31:02-04:00",
"revision_state": "CURRENT",
"status": "Approved",
"application_note": "Verified income documents.",
"status_last_modified_time": "2026-09-16T14:02:10-04:00",
"application": {
"applicant_name": {
"question_type": "NAME",
"first_name": "Dana",
"middle_name": null,
"last_name": "Reyes",
"suffix": null
},
"applicant_address": {
"question_type": "ADDRESS",
"street": "100 Main St",
"line2": "Apt 4",
"city": "Charlotte",
"state": "NC",
"zip": "28202",
"corrected": "Corrected",
"latitude": "35.2271",
"longitude": "-80.8431",
"well_known_id": "4326",
"service_area": null
},
"monthly_rent": {
"question_type": "CURRENCY",
"currency_dollars": 1450.5
},
"household_members": {
"question_type": "ENUMERATOR",
"entities": [
{
"entity_name": "Sam",
"household_member_dob": {
"question_type": "DATE",
"date": "2014-03-09"
}
}
]
},
"proof_of_income": {
"question_type": "FILE_UPLOAD",
"file_urls": [
"https://civiform.example.gov/admin/applicant-files/program-412%2Fapplicant-9031%2Fpaystub.pdf"
]
}
}
},
{
"program_name": "rental_assistance",
"program_version_id": 412,
"applicant_id": 9031,
"application_id": 22640,
"language": "en-US",
"create_time": "2026-09-10T16:40:07-04:00",
"submitter_type": "APPLICANT",
"ti_email": null,
"ti_organization": null,
"submit_time": "2026-09-10T16:55:49-04:00",
"revision_state": "OBSOLETE",
"status": null,
"application_note": null,
"status_last_modified_time": null,
"application": {
"applicant_name": {
"question_type": "NAME",
"first_name": "Dana",
"middle_name": null,
"last_name": "Reyes",
"suffix": null
}
}
}
],
"nextPageToken": "eyJwYXlsb2FkIjoie1wicGFnZVNwZWNcIjp7...}"
}The OpenAPI document above describes what is the same on every CiviForm deployment. The answer schema for one program depends on that program's questions; signed-in admins can download it from /docs/api/schemas/<programSlug> on their own deployment. The sections below describe every field in prose.
Parameters
Path parameters
programSlug
Parameter:
programSlugFormat: A string matching a program slug, such as
sample-program.Description: Human readable identifier for the program to export. This is defined by the CiviForm admin during program creation. The CiviForm admin can find the slug for a program by examining the deep link URL on the program index page or in the list of allowed programs on the API key index page.
Query parameters
All query parameters are optional, but case-sensitive.
fromDate
Parameter:
fromDateFormat: An ISO-8601 date-time with zone (
YYYY-MM-DDThh:mm:ssZ), a local date-time without zone (YYYY-MM-DDThh:mm:ss), or a date (YYYY-MM-DD).Description: Limits results to applications submitted on or after the provided date. Uses the CiviForm instance's local timezone when no timezone is provided, and the beginning of the day when no time is provided.
toDate
Parameter:
toDateFormat: An ISO-8601 date-time with zone (
YYYY-MM-DDThh:mm:ssZ), a local date-time without zone (YYYY-MM-DDThh:mm:ss), or a date (YYYY-MM-DD).Description: Limits results to applications submitted before the provided date. Uses the CiviForm instance's local timezone when no timezone is provided, and the beginning of the day when no time is provided.
revisionState
Parameter:
revisionStateFormat: A string representing the
RevisionStateenum, currently consisting of one ofOBSOLETEorCURRENT.Description: The revision state of applications to include in results.
CURRENTindicates this is the most recent version of the application.OBSOLETEindicates this application has been superseded by a newer submission. When omitted, applications of all revision states are returned.
pageSize
Parameter:
pageSizeFormat: A positive integer.
Description: Limits the number of results per page. When omitted, CiviForm's configured maximum is used; the default maximum is 1,000 and is configurable. Larger values are not reduced to the maximum, so stay at or below 1,000. Zero and negative values are not supported.
nextPageToken
Parameter:
nextPageTokenFormat: An opaque token, such as
eyJzZXJpYWxpemVkUGF5bG9hfQ==Description: An opaque, alphanumeric identifier for a specific page of results. When included CiviForm will return a page of results corresponding to the token. See Pagination for more.
Responses
400: Bad Request
Returned if any request parameters fail validation. The body is a plain-text message, for example Malformed query param: fromDate or Request parameters must match pagination token: pageSize.
401: Unauthorized
Returned if the API key is invalid or does not have access to the program, including when the program slug does not exist, since no key can hold a grant for it. The body is empty; check the server logs for the specific reason.
200: OK
For valid requests, CiviForm returns a status code 200 with a JSON body of the structure:
Pagination
If there are more results for the request, nextPageToken will be a string. If there are no more results to fetch it will be null. API consumers should request more pages using the nextPageToken query paramater until it returns null to ensure they have received a complete result set.
If nextPageToken is present, fromDate, toDate and pageSize may be omitted; they are carried inside the token. revisionState must be repeated with the same value if it was set on the initial request, because an omitted revisionState means "all revision states" and CiviForm compares that with the token. Any parameter that is repeated must match the value on the initial request or CiviForm will reject the request as invalid. A filter the token does not carry may be added and applies from that page on.
Payload
The value of the payload property is an array of objects, each consisting of metadata about an application and the application itself.
For example, one of these objects might look like this:
Payload metadata
applicant_id
Property:
applicant_idJSON Type:
numberFormat: Integer
Description: The unique integer ID of the applicant.
application_id
Property:
application_idJSON Type:
numberFormat: Integer
Description: The unique integer ID of this application.
create_time
Property:
create_timeJSON Type:
stringFormat: A datetime formatted in the ISO 8601 extended offset format. For example,
2023-10-26T15:01:56-07:00. Note: See the DateTimeFormatter javadoc for format pattern specifics. This is the ISO_OFFSET_DATE_TIME format.Description: The time the first question in a program was submitted, in the timezone of the CiviForm instance. Note: If a question is shared between programs, a question must be submitted as part of this program to set
create_time. Questions submitted as part of another program do not start the clock.
language
Property:
languageJSON Type:
stringFormat: An IETF language tag language tag. US English is
en-US.Description: Indicates the applicant's preferred language, as specified by the language dropdown in the header bar.
program_name
Property:
program_nameJSON Type:
stringFormat: All URL-safe characters
Description: The immutable admin name of the program. This is also the
programSlugused in the API request.
program_version_id
Property:
program_version_idJSON Type:
numberFormat: Integer
Description: The unique integer ID of this version of the program. This ID changes every time a program, or question within a program, is updated. If you need a stable identifier for a program, use the
program_name.
revision_state
Property:
revision_stateJSON Type:
stringValue: An enum currently consisting of one of [
CURRENT,OBSOLETE]. Note: More values may be added to this enum in the future. Ensure client code can handle additional "unknown" values.Description: Describes the current state of this application.
CURRENTindicates this is the most recent version of the application.OBSOLETEindicates this application has been superseded by a newer submission.
status
Property:
statusJSON Type:
stringornullValue: All characters
Description: The admin-defined status of this application, as selected by a Program Admin. See Add statuses to a program and Review completed applications for more.
status_last_modified_time
Property:
status_last_modified_timeJSON Type:
stringornullValue: A datetime formatted in the ISO 8601 extended offset format. For example,
2023-10-26T15:01:56-07:00. Note: See the DateTimeFormatter javadoc for format pattern specifics. This is the ISO_OFFSET_DATE_TIME format.Description: The time the status of the application was set or changed last, in the timezone of the CiviForm instance.
application_note
Property:
application_noteJSON Type:
stringornullValue: All characters
Description: Admin notes about an application
submit_time
Property:
submit_timeJSON Type:
stringValue: A datetime formatted in the ISO 8601 extended offset format. For example,
2023-10-26T15:01:56-07:00. Note: See the DateTimeFormatter javadoc for format pattern specifics. This is the ISO_OFFSET_DATE_TIME format.Description: The time the application was submitted, in the timezone of the CiviForm instance.
submitter_type
Property:
submitter_typeJSON Type:
stringValue: An enum consisting of one of [
APPLICANT,TRUSTED_INTERMEDIARY] Note: More values may be added to this enum in the future. Ensure client code can handle additional "unknown" values.Description: The type of user submitting the application.
APPLICANTindicates the applicant submitted the application themselves, andTRUSTED_INTERMEDIARYindicates the application was submitted by a TI on behalf of an applicant.
ti_email
Property:
ti_emailJSON Type:
stringornullValue: All characters, formatted as an email address
Description: The email address of the TI that submitted the application on behalf of an applicant.
nullif the applicant submitted the application themselves.
ti_organization
Property:
ti_organizationJSON Type:
stringornullValue: All characters.
Description: The name of the organization the TI belongs to, as specified in the Intermediaries admin panel. See Manage trusted intermediaries for more.
application
Property:
applicationJSON Type:
objectValue: The applicant's application
Description: See the Application object section below.
Application object
The application object contains the applicant's answers to the questions in the program. It's a snapshot of the applicant's answers at the time they clicked submit on their application, and is not updated if they change their answer to a question as part of filling out an application to a different program.
If they update their answers to this program and click submit again, a new application entry is created. See the revision_state metadata field for more.
The application object includes all questions that have ever been in a program, even if the applicant did not answer them or they were skipped due to a visibility condition.
The application object is organized as a set of key-object pairs that represent each question in the program. The key is generated from the admin name of the question, and the objectcontains the applicant's answer. For example, this is the application object for a program with two questions:
"What is your name?", which has a question key of
applicant_name."What is your favorite color?", which has a question key of
favorite_color.
Question keys
The question key is generated from the immutable admin name of the question. The immutable admin name of the question is specified by the admin when creating a question, and the question key is visible in the generated API docs page.
The question key is generated by removing non-letter characters and replacing spaces with underscores, so applicant name4? becomes applicant_name.
For enumerator questions, such as "List all the members of your household?" (which might have a question key of household_members), and "What are each of their favorite colors?" (question key of household_member_favorite_color), the repeated question is nested under the enumerator question like this:
In this example, to access the favorite color of the third household member, you'd use this path through the application object:
See Enumerator questions below for more about enumerator questions.
Question objects
Question objects contain the applicant's answers to a question, as well as some additional metadata. They all contain the same metadata property, as well as additional properties that vary based on the question type.
Question metadata
All question objects have a question_type field.
Property:
question_typeJSON Type:
stringFormat: An enum currently consisting of one of [
ADDRESS,MULTI_SELECT,CURRENCY,DATE,SINGLE_SELECT,EMAIL,ENUMERATOR,FILE_UPLOAD,ID,MAP,NAME,NUMBER,TEXT,PHONE]. Note: More values may be added to this enum in the future. Ensure client code can handle additional "unknown" values.Description: Specifies the type of question this object represents.
Address questions
"question_type": "ADDRESS"
In addition to the metadata field, address questions have the following properties:
street
Property:
streetJSON Type:
stringornullFormat: A Unicode
stringof any characters.nullif the question was unanswered.Description: The "street" portion of the applicant's address. If any of
street,line2,city,state, orzipare provided, then onlyline2is optional.
line2
Property:
line2JSON Type:
stringornullFormat: A Unicode
stringof any characters.nullif the question was unanswered or the field was not filled.Description: The second line of the applicant's address (such as their apartment, suite number, etc). If any of
street,line2,city,state, orzipare provided, then onlyline2is optional.
city
Property:
cityJSON Type:
stringornullFormat: A Unicode
stringof any characters.nullif the question was unanswered.Description: The "city" portion of the applicant's address. If any of
street,line2,city,state, orzipare provided, then onlyline2is optional.
state
Property:
stateJSON Type:
stringornullFormat: A two letter state code, capitalized. (e.g.
NY). Includes 50 states, DC, and 8 territories. See USPS's Two–Letter State and Possession Abbreviations for the full list.nullif the question was unanswered.Description: The "state" portion of the applicant's address. If any of
street,line2,city,state, orzipare provided, then onlyline2is optional.
zip
Property:
zipJSON Type:
stringornullFormat: A Unicode
stringconsisting of 5 digits (55555), or 5 digits, a dash, a 4 digits (55555-5555).nullif the question was unanswered.Description: The "zip" portion of the applicant's address. If any of
street,line2,city,state, orzipare provided, then onlyline2is optional.
corrected
Property:
correctedJSON Type:
stringornullFormat: An enum consisting of [
Corrected,Failed,AsEnteredByUser] ornullif the question was unanswered or address correction is not enabled.Description: Indicates the result of correcting an address.
latitude
Property:
latitudeJSON Type:
stringornullFormat: A string consistening of a signed Java
double.nullif the question was unanswered, the address was not corrected, address correction failed, or the user kept the address as they entered it.Description: The latitude of the applicant's corrected address, as specified by the address correction server.
longitude
Property:
longitudeJSON Type:
stringornullFormat: A string consistening of a signed Java
double.nullif the question was unanswered, the address was not corrected, address correction failed, or the user kept the address as they entered it.Description: The longitude of the applicant's corrected address, as specified by the address correction server.
well_known_id
Property:
well_known_idJSON Type:
stringornullFormat: A Well Known ID for a spacial reference system.
nullif the question was unanswered, the address was not corrected, address correction failed, or the user kept the address as they entered it.Description: The Well Known ID for the spacial reference system used by the
latitudeandlongitudeproperties.
service_area
Property:
service_areaJSON Type:
stringornullFormat: A comma-separated, serialized list of service areas. Each is formatted as
{service area name}_{inclusion state}_{unix timestamp}, such asspringfield_county_InArea_1709069741. The service area name is defined by the admin, the inclusion state is one of [InArea,NotInArea,Failed], and the unix timestamp is the time when the inclusion check was made.nullif the question was unanswered, the address was not corrected, address correction failed, or the user kept the address as they entered it. See Configure GIS Service andServiceAreaInclusionGroup.javafor more.Description: Describes the service areas this address has been validated against, and whether it is in each one.
Altogether, an address question looks like
Checkbox questions
Checkbox questions are a form of multi-select question. See Multiselect questions below.
Currency questions
"question_type": "CURRENCY"
In addition to the metadata field, currency questions have the following property:
currency_dollars
Property:
currency_dollarsJSON Type:
numberornullFormat: A JSON number.
nullif unanswered.Description: An amount, in dollars.
A currency question looks like
Date questions
"question_type": "DATE"
In addition to the metadata field, date questions have the following property:
date
Property:
dateJSON Type:
stringornullFormat: An ISO 8601 formatted date, without the timezone. e.g
YYYY-MM-DD.nullif unanswered.Description: The applicant's answer to the date question.
A date question looks like
Dropdown questions
Dropdown questions are a form of single-select questions. See Single-select questions below.
Email questions
"question_type": "EMAIL"
In addition to the metadata field, email questions have the following property:
email
Property:
emailJSON Type:
stringornullFormat: A Unicode string containing an email address, as validated by the applicant's browser.
nullif unanswered. Note: This is only client-side validated, so it should be treated as containing anything. No validation is performed if the applicant's browser doesn't properly validate fields with<input type="email">. See MDN for more.Description: The applicant's answer to the email question.
An email question looks like
Enumerator questions
"question_type": "ENUMERATOR"
Enumerator questions allow you to ask applicants the same question about multiple entities. For example, how many hours do they work at each of their jobs? Or what is the age of each of their household members?
Applicants are asked to list the name of each entity, and then asked each repeated question for each entity they named.
In addition to the metadata field, enumerator questions have the following property:
entities
Property:
entitiesJSON Type:
[object]Format: An array of JSON
objects, each of which represents a repeated entity. Empty[]if unanswered.Description: The list of repeated entities, each of which contains answers to the repeated questions for that entity.
Repeated entity objects
Each repeated entity is an object that follows the same semantics as the application object as a whole. It has an entity_name property, as well as a property for each repeated question.
entity_name
Property:
entity_nameJSON Type:
stringFormat: A Unicode
stringof any characters.Description: The name the applicant provided for each repeated entity. Used on each repeated screen in the repeated question title, such as "What is
$household_member's phone number?"
An enumerator question, with two entities and a repeated household_member_phone_number phone question and a repeated household_member_job text question, looks like
File upload questions
"question_type": "FILE_UPLOAD"
In addition to the metadata field, file upload questions have the following property. (An earlier file_key property is no longer emitted; use file_urls.)
file_urls
Property:
file_urlsJSON Type:
[string]Format: An array of URLs, or an empty array
[]if unanswered.Description: An array of links to the file the applicant uploaded. Note: This link is not a link to the file that can be used programatically. It's a link that requires a Program Admin login to retrieve the file.
An file upload question looks like
ID questions
"question_type": "ID"
In addition to the metadata field, ID questions have the following property:
id
Property:
idJSON Type:
stringornullFormat: A Unicode string consisting of only digits (
^[0-9]*$). If min or max lengths are specified on the question they are also enforced.nullif unanswered. Note: Answers from applications from before a min or max constraint is added to a question will not follow that constraint and may be of any length.Description: The applicant's answer to the ID question.
An ID question looks like
Multi-select questions
"question_type": "MULTI_SELECT"
Multi-select questions allow applicants to select multiple options from a list.
In addition to the metadata field, multi-select questions have the following property:
selections
Property:
selectionsJSON Type:
[string]Format: An array of Unicode
strings, which are the admin IDs of the selected options. An empty array[]if no options were selected or the question was unanswered. With the exception of questions created before March 2024, admin IDs can only contain lowercase letters, numbers, underscores, and dashes. Note: Any option admin ID that has ever been available for applicants to select may be returned. A list of all possible option admin IDs is available in the program-specific API docs in your CiviForm instance.Description: A list of the question options selected by the applicant.
A multi-select question looks like
Name questions
"question_type": "NAME"
In addition to the metadata field, name questions have the following properties:
first_name
Property:
first_nameJSON Type:
stringornullFormat: A Unicode string of any characters.
nullif the question is unanswered.Description: The applicant's first name. If the question is answered, only the
middle_nameandsuffixare optional.
middle_name
Property:
middle_nameJSON Type:
stringornullFormat: A Unicode string of any characters.
nullif unanswered or not provided.Description: The applicant's middle name. If the question is answered, only the
middle_nameandsuffixare optional.
last_name
Property:
last_nameJSON Type:
stringornullFormat: A Unicode string of any characters.
nullif the question is unanswered.Description: The applicant's last name. If the question is answered, only the
middle_nameandsuffixare optional.
suffix
Property:
suffixJSON Type:
stringValue: An enum currently conssiting of one of [
JR,SR,I,II,III,IV,V]. Note: More values may be added to this enum in the future. Ensure client code can handle additional "unknown" values.Description: The applicant's name suffix. If the question is answered, only the
middle_nameandsuffixare optional.
A name question looks like
Number questions
"question_type": "NUMBER"
In addition to the metadata field, number questions have the following property:
number
Property:
numberJSON Type:
numberornullFormat: An integer number. If min or max values are specified on the question they are also enforced.
nullif unanswered. Note: Answers from applications from before a min or max constraint is added to a question will not follow that constraint and may be of any value.Description: The applicant's answer to the number question.
A number question looks like
Radio questions
Radio questions are a form of single-select questions. See Single-select questions below.
Single-select questions
"question_type": "SINGLE_SELECT"
Single-select questions allow applicants to select a single option from a list.
In addition to the metadata field, single-select questions have the following property:
selection
Property:
selectionJSON Type:
stringornullFormat: A Unicode
stringcontaining the admin ID of the selected option.nullif unanswered. With the exception of questions created before March 2024, admin IDs can only contain lowercase letters, numbers, underscores, and dashes. Note: Any option admin ID that has ever been available for applicants to select may be returned. A list of all possible option admin IDs is available in the program-specific API docs in your CiviForm instance.Description: The question option selected by the applicant.
A single-select question looks like
Static text questions
Static text questions are not presented in the API because there is nothing for the applicant to answer.
Text questions
"question_type": "TEXT"
In addition to the metadata field, text questions have the following property:
text
Property:
textJSON Type:
stringornullFormat: A Unicode
stringcontaining any characters. If min or max lengths are specified on the question they are also enforced.nullif unanswered. Note: Answers from applications from before a min or max constraint is added to a question will not follow that constraint and may be of any length.Description: The applicant's answer to the text question.
A text question looks like
Phone number questions
"question_type": "PHONE"
In addition to the metadata field, phone number questions have the following property:
phone_number
Property:
phone_numberJSON Type:
stringornullFormat: A Unicode
stringconsisting of a phone number prefixed with the country-code, in E164 format. For example,+15556667777.nullif unanswered. Note: Phone numbers are validated to be in a valid pattern, but are not confirmed to be dialable.Description: The applicant's answer to the phone number question.
A phone number question looks like
Example endpoint response
Generated program-specific docs
For an example response for one of your programs, go to "API" > "Documentation" in the admin console, or visit <my civiform url>/docs/api/programs. You can see the example response for both your active and draft programs.
Generic program example
Below is an example endpoint response for a generic program.
Example client code: python
Below is a very minimal script demonstrating how to request applications to a program named "Utility discount program" between January 3, 2022 and February 4, 2022, with a page size of 100.
Last updated
Was this helpful?