PHPackages                             mchev/laravel-odk - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. mchev/laravel-odk

ActiveLibrary[API Development](/categories/api)

mchev/laravel-odk
=================

Laravel-ODK is a simple wrapper around the ODK Central API that makes working with its endpoints a breeze!

v1.3.0(3y ago)41251MITPHPPHP ^7.4|^8.0CI failing

Since Jul 27Pushed 1y ago1 watchersCompare

[ Source](https://github.com/mchev/laravel-odk)[ Packagist](https://packagist.org/packages/mchev/laravel-odk)[ Docs](https://github.com/mchev/laravel-odk)[ RSS](/packages/mchev-laravel-odk/feed)WikiDiscussions master Synced 2d ago

READMEChangelog (10)Dependencies (5)Versions (16)Used By (0)

Laravel ODK
===========

[](#laravel-odk)

[![Latest Version on Packagist](https://camo.githubusercontent.com/94d1e976d5f3742f6d59afcc423ec654f3273f40d5f0e0abb3f19a37c0761ac7/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6d636865762f6c61726176656c2d6f646b2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/mchev/laravel-odk)[![Total Downloads](https://camo.githubusercontent.com/f6a45bd6f9f63b253308649d7d38c92462bfd86aa24e1e9846af693273b205a2/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6d636865762f6c61726176656c2d6f646b2e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/mchev/laravel-odk)[![GitHub Actions](https://github.com/mchev/laravel-odk/actions/workflows/main.yml/badge.svg)](https://github.com/mchev/laravel-odk/actions/workflows/main.yml/badge.svg)[![Laravel compatibility](https://camo.githubusercontent.com/306415e457bf0065a014be7dade74dab3980894b1f3a94d620a622e46528f5e7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c61726176656c2d253545382e30253743253545392e3025374325354531302e3025374325354531312e302d627269676874677265656e)](https://camo.githubusercontent.com/306415e457bf0065a014be7dade74dab3980894b1f3a94d620a622e46528f5e7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c61726176656c2d253545382e30253743253545392e3025374325354531302e3025374325354531312e302d627269676874677265656e)

**This is a community project and not an official Laravel one**

Laravel-ODK is a simple wrapper around the ODK Central API that makes working with its endpoints a breeze! To get more informations about the API see [https://odkcentral.docs.apiary.io/](https://odkcentral.docs.apiary.io/#)

Installation
------------

[](#installation)

You can install the package via composer:

```
composer require mchev/laravel-odk
```

Configuration
-------------

[](#configuration)

Publish the config of the package.

```
php artisan vendor:publish --provider="Mchev\LaravelOdk\Providers\OdkCentralServiceProvider" --tag=config
```

The following config will be published to config/odkcentral.php.

```
return [

    /*
    |--------------------------------------------------------------------------
    | ODK Central API url
    |--------------------------------------------------------------------------
    |
    | Here you may specify the default url for the API calls.
    | Example : https://private-anon-cecdde38ec-odkcentral.apiary-mock.com/v1
    |
    */

    'api_url' => env('ODK_API_URL'),

    /*
    |--------------------------------------------------------------------------
    | ODK Central Authentification
    |--------------------------------------------------------------------------
    |
    | An administrator user of your ODK Central app.
    |
    */

    'user_email' => env('ODK_USER_EMAIL'),

    'user_password' => env('ODK_USER_PASSWORD'),

];
```

Set the `ODK_API_URL`, `ODK_USER_EMAIL` and `ODK_USER_PASSWORD` of your [ODK Central App](https://docs.getodk.org/getting-started/) in your `.env` file.

```
ODK_API_URL="https://your_host.com/v1"
ODK_USER_EMAIL=your_email
ODK_USER_PASSWORD=your_password

```

Don't forget to run `php artisan config:clear`

If you change your crendentials later you will also have to run `php artisan cache:clear`. The authentification token is cached for 3600 seconds.

Usage
-----

[](#usage)

```
namespace App\Http\Controllers;

use Mchev\LaravelOdk\OdkCentral;

class SomeController
{
    public function testOdk()
    {
      $odk = new OdkCentral;
      $project = $odk->projects(1)->get();
      dd($project);
    }
}
```

Usage with Facade :

```
namespace App\Http\Controllers;

use Mchev\LaravelOdk\Facades\OdkCentral;

class SomeController
{
    public function returnFormFields($projectId, $xmlFormId)
    {
      $fields = OdkCentral::projects($projectId)->forms($xmlFormId)->fields()->get();
      dd($fields);
    }
}
```

### [Users](https://odkcentral.docs.apiary.io/#reference/accounts-and-users/users)

[](#users)

```
// Get all users.
$users = $odk->users()->get();

// Searching users
$users = $odk->users('Jane')->get();

// You can also use eloquent 💥
$users = $odk->users()->get()->sortBy('displayName');

// Creating a new user.
$user = $odk->users()->create([
  'email' => 'example@email.com',
  'password' => 'password' // Optional (That email address will receive a message instructing the new user on how to claim their new account and set a password.)
]);

// Getting User details
$user = $odk->users($userId)->get();

// Getting authenticated User details
$user = $odk->users()->current();

// Modifying a User
$user = $odk->users($userId)->update([
  'displayName' => 'New name', // string
  'email' => 'new.email.address@demo.org' // string
]);

// Directly updating a user password
$user = $odk->users($userId)->updatePassword([
  'old' => 'old.password', // string
  'new' => 'new.password' // string
]);

// Initiating a password reset
$user = $odk->users()->passwordReset($userEmail);

// Deleting a User
$user = $odk->users($userId)->delete();
```

### [App Users](https://odkcentral.docs.apiary.io/#reference/accounts-and-users/app-users)

[](#app-users)

```
// Listing all App Users.
$appUsers = $odk->projects($projectId)->appUsers()->get();

// Creating a new App User.
$appUser = $odk->projects($projectId)->appUsers()->create([
  'displayName' => 'Jane Doe'
]);

// Deleting a App User
$appUser = $odk->projects($projectId)->appUsers($appUserId)->delete();
```

### [Projects](https://odkcentral.docs.apiary.io/#reference/project-management)

[](#projects)

```
// Get a list of projects.
$projects = $odk->projects()->get();

// Creating a Project.
$project = $odk->projects()->create([
  'name' => 'My new project'
]);

// Getting Project details
$project = $odk->projects($projectId)->get();

// Updating Project Details
$project = $odk->projects($projectId)->update([
  'name' => 'New name', // string | required
  'archived' => false // boolean | optional
]);

// Deep Updating Project and Form Details
$project = $odk->projects($projectId)->deepUpdate([
  'name' => 'New name', // string | required
  'archived' => false, // boolean | optional
  'forms' => [
    {
      "xmlFormId": "simple",
      "state": "open",
      "assignments": [
        {
          "roleId": 2,
          "actorId": 14
        }
      ]
    }
  ], // array | infos : https://odkcentral.docs.apiary.io/#reference/project-management/projects/deep-updating-project-and-form-details
]);

// Enabling Project Managed Encryption
$project = $odk->projects($projectId)->encrypt([
  'passphrase' => 'Super duper secret', // string | required
  'hint' => 'My reminder' // string | optional
]);

// Deleting a Project
$project = $odk->projects($projectId)->delete();
```

### [Forms](https://odkcentral.docs.apiary.io/#reference/forms)

[](#forms)

```
// List all forms of a project.
$forms = $odk->projects($projectId)->forms()->get();

// Creating new form (sending XForms XML or XLSForm file)
// If the second parameter is set to false, the form will be stored as draft.
$form = $odk->projects($projectId)->forms()->create($request->file('your_input_file'), true);

// Getting form details
$form = $odk->projects($projectId)->forms($xmlFormId)->get();

// Getting form schema fields
$form = $odk->projects($projectId)->forms($xmlFormId)->fields()->get();
// You may optionally add the 'true' parameter to the fields() method to sanitize the field names and paths to match the way they will be outputted for OData

// Listing form attachments
$form = $odk->projects($projectId)->forms($xmlFormId)->attachments()->get();

// Downloading a form attachment
return $odk->projects($projectId)->forms($xmlFormId)->downloadAttachment($filename);

// Modifying a form
$form = $odk->projects($projectId)->forms($xmlFormId)->update([
  'state' => 'open'
]);

// Deleting a form
$form = $odk->projects($projectId)->forms($xmlFormId)->delete();

// Download form file (xml, xls, xlsx)
return $odk->projects($projectId)->forms($xmlFormId)->xlsx()->download(); // xml(), xls(), xlsx()
```

### [Draft](https://odkcentral.docs.apiary.io/#reference/forms/draft-form)

[](#draft)

```
// Let's say we already have our form
$form = $odk->projects($projectId)->forms($xmlFormId);

// Create a new draft
$form->draft()->create($request->file('your_input_file'));

// Getting Draft Form Details
$form->draft()->get();

// Getting Draft Form Fields
$form->draft()->fields();

// Publish the draft
$form->draft()->publish('v1.2.0'); // string | optional

// Deleting the draft
$form->draft()->delete();
```

### [Submissions](https://odkcentral.docs.apiary.io/#reference/submissions)

[](#submissions)

```
// Listing all submissions on a form
$submissions = $odk->projects($projectId)->forms($xmlFormId)->submissions()->get();

// Getting Submission metadata
$submissions = $odk->projects($projectId)->forms($xmlFormId)->submissions($instanceId)->get();

// Updating Submission metadata
$submissions = $odk->projects($projectId)->forms($xmlFormId)->submissions($instanceId)->update([
  'reviewState' => 'approved' // null, edited, hasIssues, rejected, approved | enum
]);

// Retrieving Submission XML
$submissions = $odk->projects($projectId)->forms($xmlFormId)->submissions($instanceId)->xml();

// Geting Submission comments
$submissions = $odk->projects($projectId)->forms($xmlFormId)->submissions($instanceId)->comments()->get();

// Posting Submission comments
$submission = $odk->projects($projectId)->forms($xmlFormId)->submissions($instanceId)->comments()->create([
  'body' => 'this is the text of my comment',
]);
```

### Answers/Responses

[](#answersresponses)

```
// Our form
$form = $odk->projects($projectId)->forms($xmlFormId);

// You can get answers directly :
$answers = $form()->answers();
// OR
$anwserWithRepeats = $form()->answersWithRepeats();

// If you need to get only answers associated to a submission :
$answers = $form()->submissions($submissionId)->answers();
// OR
$anwserWithRepeats = $form()->submissions($submissionId)->answersWithRepeats();

// answersWithRepeats() method accept a boolean parameter to only get the questions and responses (no meta, ids, etc)
$onlyAnswers = $form()->submissions($submissionId)->answersWithRepeats(true);
```

### Odata

[](#odata)

```
// Our form
$form = $odk->projects($projectId)->forms($xmlFormId);

/**
 * OData request.
 *
 * @param string $url
 * @param boolean $top
 * @param boolean $skip
 * @param boolean $count
 * @param boolean $wkt
 * @param string $filter
 * @param boolean $expand
 */
$data = $form->odata($url= '', $top = false, $skip = false, $count = false, $wkt = false, $filter = '', $expand = false)->get();

// Example :
$submissions = $form->odata('Submissions')->get();
```

### Testing

[](#testing)

```
composer test
```

### Changelog

[](#changelog)

Please see [CHANGELOG](CHANGELOG.md) for more information what has changed recently.

Contributing
------------

[](#contributing)

Please see [CONTRIBUTING](CONTRIBUTING.md) for details.

Credits
-------

[](#credits)

- [Martin Chevignard](https://github.com/mchev)
- [All Contributors](../../contributors)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

Laravel Package Boilerplate
---------------------------

[](#laravel-package-boilerplate)

This package was generated using the [Laravel Package Boilerplate](https://laravelpackageboilerplate.com).

###  Health Score

33

—

LowBetter than 75% of packages

Maintenance32

Infrequent updates — may be unmaintained

Popularity15

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity64

Established project with proven stability

 Bus Factor1

Top contributor holds 97.9% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~39 days

Recently: every ~132 days

Total

15

Last Release

1191d ago

Major Versions

v0.1.2 → v1.0.02021-07-29

### Community

Maintainers

![](https://www.gravatar.com/avatar/1a4fc05da542c49e0d7d3aa2bd8c077c80c502ad2beeee5da4d5ed398e5de296?d=identicon)[mchev](/maintainers/mchev)

---

Top Contributors

[![mchev](https://avatars.githubusercontent.com/u/5514329?v=4)](https://github.com/mchev "mchev (92 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (2 commits)")

---

Tags

apilaravelodkodk-centralodk-xformsphpwrapperapilaravelwrappermchevodklaravel-odkodk-central

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/mchev-laravel-odk/health.svg)

```
[![Health](https://phpackages.com/badges/mchev-laravel-odk/health.svg)](https://phpackages.com/packages/mchev-laravel-odk)
```

###  Alternatives

[aerni/laravel-spotify

A Laravel wrapper for the Spotify Web API

209145.6k](/packages/aerni-laravel-spotify)[smodav/mpesa

M-Pesa API implementation

16363.7k1](/packages/smodav-mpesa)[dariusiii/tmdb-laravel

Laravel Package for TMDB ( The Movie Database ) API. Provides easy access to the wtfzdotnet/php-tmdb-api library.

1821.1k](/packages/dariusiii-tmdb-laravel)[lasserafn/laravel-economic

Economic REST wrapper for Laravel

1118.5k](/packages/lasserafn-laravel-economic)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
